Как протестировать, если курсор пуст в запросе 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, если таблица имеет две записи и т.д.
Можете ли вы предложить какой-то метод решения моей проблемы при запуске разных действий на основе того, является ли курсор пустым или нет.
Ответы
Ответ 1
Как насчет тестирования курсора, как это, а затем сделайте то, что вы сказали:
if(cursor!=null && cursor.getCount()>0)
getCount()
Возвращает числа строк в курсоре
http://developer.android.com/reference/android/database/Cursor.html#getCount()
Ответ 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(), чтобы определить, есть ли в таблице что-либо.