Как отсортировать базу данных SQLite по onCreate, а также по onResume, основываясь на общих предпочтениях? - PullRequest
0 голосов
/ 06 октября 2011

Я пытаюсь получить базу данных в моем приложении для сортировки данных, прежде чем они будут переданы в просмотр списка с помощью специального адаптера списка.Я думал, что понял это, но каждый раз, когда я запускаю это, я получаю ФК.Код в 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, я вижу исключение нулевого указателя, которое указывает на строку 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 Ответ

1 голос
/ 06 октября 2011

Я предполагаю, что constantsCursor никогда не инициализируется, потому что ни одно из этих if-условий не выполняется.Строки - это объекты, поэтому вы не можете сравнивать их с оператором == (см. Обсуждение в этом посте ), поэтому все ваши условия оцениваются как ложные.Вместо этого используйте Object.equals(other_object) для проверки эквивалентности, например так: else if (sortorder.equals("id")).

Также обратите внимание, что Cursor.requery() устарела.Лучше просто вызвать close () на курсоре, когда вы закончите с ним, и получить еще один позже.Может быть, переместить этот код базы данных в закрытый метод, который возвращает курсор.Затем вызовите этот закрытый метод из onCreate () и onResume (), если это то, что необходимо.

...