Как проверить, пуст ли курсор в запросе SQLiteDatabase - PullRequest
23 голосов
/ 28 августа 2011

У меня есть таблица SQL, которая создается с помощью следующего кода:

public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT
        + " TEXT NOT NULL," + TOPIC + " TEXT NOT NULL, "
        + LECTURENUMBER + " TEXT NOT NULL, " + PAGENUMBER
        + " TEXT NOT NULL, " + DATE + " TEXT NOT NULL, " + _DATA
        + " TEXT NOT NULL);");
}

Я запрашиваю таблицу следующим образом:

String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME
    + " GROUP BY " + SUBJECT + ";";

Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null);

Проблема в том, что я должен запустить операциюA, если курсор пуст (т. Е. Таблица не содержит значений) и Activity B, если курсор не пуст (т. Е. Таблица заполнена).

Я не могу найти метод, который может сказать мне, еслитаблица пуста или нет.Я пытался использовать журнал следующим образом:

private void showSubjectsOnList() {
    String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME
        + " GROUP BY " + SUBJECT + ";";

    Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null);

    Log.d("Events",Integer.toString(cursor.getCount()));
    if(cursor.isNull(0)!=false){
        cursor.close();
        subjects.close();
        startActivity(new Intent(this,OpenScreen.class));
    }
}

Но журнал показывает 1, если таблица пуста ... и снова 1, если таблица имеет 1 запись .... он показывает 2, еслитаблица содержит две записи и т. д.

Можете ли вы предложить какой-нибудь метод решения моей проблемы запуска различных действий, основанный на том, пуст ли курсор или нет.

Ответы [ 6 ]

57 голосов
/ 28 августа 2011

Как насчет того, чтобы проверить курсор, как это, и затем выполнить то, что вы сказали:

if(cursor!=null && cursor.getCount()>0)

getCount ()

Возвращает количество строккурсор

http://developer.android.com/reference/android/database/Cursor.html#getCount()

23 голосов
/ 28 августа 2011

Самым простым и чистым способом проверки пустого курсора является следующий код:

if ( cursor.moveToFirst() ) {
    // start activity a
} else {
    // start activity b
}

Согласно документам, метод возвращает false, если курсор пуст:

http://developer.android.com/reference/android/database/Cursor.html#moveToFirst%28%29

публичный абстрактный логический moveToFirst ()

Добавлено на уровне API 1. Переместите курсор на первую строку.

Этот метод вернет false, если курсор пуст .

Возвращает, был ли ход успешным.

2 голосов
/ 10 ноября 2011

Удаленные записи остаются в SQLite как нулевые записи, но getCount() учитывает только ненулевые записи. Если в вашей таблице есть несколько записей, которые являются нулевыми, некоторые из ненулевых записей будут иметь _Id числа больше, чем результат getCount(). Чтобы достичь их, вы можете выполнить итерацию курсора (используя цикл for ()), удвоив число раз, чем результат getCount(), и использовать курсор для заполнения чисел record_Id в массив. Допустим, результирующий массив равен { 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }.

Это означает, что записи 3, 4, 10, 13 являются нулевыми записями, и в вашей таблице всего 14 записей, а не 10, которые вы получили от getCount().

Помните:

  1. getCount() возвращает количество ненулевых записей,
  2. курсор возвращает _Id номера ненулевых записей,
  3. _Id чисел, «пропущенных» курсором, равны _Id номерам нулевых записей,
  4. должно достигать достаточно большего, чем getCount(), чтобы получить их все.
1 голос
/ 28 августа 2011

Вам просто нужно использовать getCount (). Если ваш sql правильный, но не возвращает ни одной строки, у вас будет нулевой объект курсора NOT, но без строк, и getCount () вернет 0.

0 голосов
/ 21 сентября 2011

Я считаю, что ваша проблема в том, что вы не создаете правильный запрос.

Вам следует использовать запрос SQLiteDatabase.

Cursor c = db.query(TABLE_NAME, null,
            null, null, null, null, null);

После этого вы можете использовать c.getCount ()если в таблице есть что-нибудь.

0 голосов
/ 28 августа 2011

Мое предложение будет использовать ListActivity.

Это действия, которые предназначены для отображения элементов в ListView.Вы можете просто использовать SimpleCursorAdapter для их заполнения (также показано на странице ListActivity s JavaDoc).

Они также предлагают setEmptyView() -метод , который может использоваться для отображения View (может быть TextView), который информирует пользователя о том, что еще нет записей и как он может их создать.

Пример того, как это сделать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...