Подтвердить что ты не робот

Как протестировать, если курсор пуст в запросе SQLiteDatabase

У меня есть таблица 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);

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

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

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));
    }
}

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

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

4b9b3361

Ответ 2

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

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

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

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

public abstract boolean moveToFirst()

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

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

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

Ответ 3

Удаленные записи остаются в 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().

Помните:

  • getCount() возвращает количество ненулевых записей,
  • курсор возвращает _Id номера не нулевых записей,
  • _Id числа "пропущенные" курсором - это _Id номера нулевых записей,
  • должен достигнуть достаточно больше, чем getCount(), чтобы получить их все.

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

Вы должны использовать запрос SQLiteDatabase.

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

Затем вы можете использовать c.getCount(), чтобы определить, есть ли в таблице что-либо.