it-swarm.com.ru

Как проверить, пуст ли курсор в запросе 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, если курсор не пустой (т. Е. Таблица заполнена).

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

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, если таблица имеет две записи и так далее.

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

22
Waneya Iqbal

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

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

getCount ()

Возвращает номера строк в курсоре

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

56
Nikola Despotoski

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

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, если курсор пуст.

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

23
SBerg413

Удаленные записи остаются в 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(), чтобы получить их все.
2
Stan

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

1
Minolan

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

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

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

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

0
AndroidDebaser

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

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

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

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

0
Lukas Knuth