Как отсортировать базу данных SQLite по onCreate, а также по onResume, основываясь на общих предпочтениях?
Я пытаюсь получить базу данных в моем приложении для сортировки данных, прежде чем они будут переданы в просмотр списка с помощью специального адаптера списка. Я думал, что понял это, но каждый раз, когда я запускаю это, я получаю ФК. Код в onCreate ниже:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
debtlist = (ListView)findViewById(R.id.debtlist);
registerForContextMenu(debtlist);
//Retrieve the users sort order
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String sortorder = sp.getString("sortPref","id");
db=new DatabaseHelper(this);
// constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+
// "FROM tblDebts ORDER BY _ID", null);
if (sortorder == "intrate")
{
constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+
"FROM tblDebts ORDER BY InterestRate DESC", null);
}
else if (sortorder == "balance")
{
constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+
"FROM tblDebts ORDER BY CurrentAmount DESC", null);
}
else if (sortorder == "id")
{
constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+
"FROM tblDebts ORDER BY _ID", null);
}
adapter1=new ImgCursorAdapter(this,
R.layout.debt_row, constantsCursor,
new String[] {DbAdapter.KEY_DEBT,
DbAdapter.KEY_STARTINGAMOUNT},
new int[] {R.id.toptext, R.id.bottomtext});
debtlist.setAdapter(adapter1);
DbAdapter debtDbAdapter = new DbAdapter(this);
debtDbAdapter.open();
updateTotalProgress();
Cursor cursor = debtDbAdapter.queueAll();
startManagingCursor(cursor);
}
Когда я запускаю свое приложение, я получаю FC, глядя на DDMS, я вижу исключение nullpointer, которое указывает на строку 130, которая есть в моем коде onResume:
@Override
public void onResume() {
super.onResume();
((BaseAdapter) adapter1).notifyDataSetChanged();
constantsCursor.requery();
debtlist.setAdapter(adapter1);
updateTotalProgress();
}
Обсуждаемая строка - это constanstCursor.requery(); один. в моих настройках xml я установил значение по умолчанию "id", но я не думаю, что в этом проблема. Я также попытался поместить тот же код для установки constanstCursor в коде onResume, чтобы заставить его воссоздать адаптер и назначить его списку, но это просто приводит к тем же ошибкам NullPointer.
Я что-то упускаю, как выбрать порядок сортировки на основе предпочтений?
<string-array name="sortArray">
<item>Highest Interest Rate</item>
<item>Highest Balance</item>
<item>No Sort</item>
</string-array>
<string-array name="sortValues">
<item>intrate</item>
<item>balance</item>
<item>id</item>
</string-array>
1 ответ
Я предполагаю, что constantsCursor никогда не инициализируется, потому что ни одно из этих if-условий не выполняется. Строки - это объекты, поэтому вы не можете сравнивать их с оператором == (см. Обсуждение в этом посте), поэтому все ваши условия оцениваются как ложные. использование Object.equals(other_object)
вместо этого проверить на эквивалентность, вот так: else if (sortorder.equals("id"))
,
Также обратите внимание, что Cursor.requery()
устарела. Лучше просто вызвать close() на курсоре, когда вы закончите с ним, и получить еще один позже. Может быть, переместить этот код базы данных в закрытый метод, который возвращает курсор. Затем вызовите этот закрытый метод из onCreate() и onResume(), если это то, что необходимо.