Будет ли пустой курсор SQLite возвращать true для isBeforeFirst, isAfterLast, оба или ни того, ни другого? - PullRequest
6 голосов
/ 17 сентября 2011

Это довольно простой вопрос.Я надеюсь, что ответ «оба», но я боюсь, что ни то, ни другое.Я изучил документы для разработчиков Android для SQLiteDatabase и Cursor , но не могу найти однозначного ответа на этот вопрос.

Случай, который я спрашиваю огде я получаю курсор, вызываю moveToFirst, затем зацикливаюсь, пока isAfterLast не вернет true.Было бы очень удобно для шаблона, который я кодирую несколько раз, если бы он просто работал и выполнял цикл 0 раз, если курсор имеет 0 записей.

Или мне нужно явно проверить наличие пустого курсорапервый?

РЕДАКТИРОВАТЬ: Некоторые ответы показывают, что люди не совсем понимают, что я спрашиваю.В принципе, я хотел бы написать это:

cursor = myDb.query(...)
cursor.moveToFirst()
while (!cursor.isAfterLast()) {
    processRow(...)
}

Но я не уверен на 100%, что могу.isAfterLast не может ничего вернуть полезно , но верно для этого случая, но это не значит, что оно действительно возвращает true для пустого запроса.Документы, похоже, не указывают, какое возвращаемое значение у большинства методов курсора, если курсор пуст (документация по Android кажется довольно неопределенной во многих угловых случаях), кроме getCount.Поэтому я беспокоюсь о том, что мне нужно сделать следующее:

cursor = myDb.query(...)
if (cusror.getCount() > 0) {
    cursor.moveToFirst()
    while (!cursor.isAfterLast()) {
        processRow(...)
    }
}

Что является беспорядочным и логически избыточным.Имейте в виду, что в реальной реализации кода больше, и он распространяется на несколько методов.И один из ответов теперь предлагает мне также проверить курсор на null, что полностью недокументировано ...

Я просто хочу знать, знает ли кто-нибудь еще действительное поведение isAfterLast при вызове пустого курсора.

Ответы [ 2 ]

6 голосов
/ 05 октября 2014

Когда курсор пуст,

cursor.moveToFirst () возвращает false
cursor.isBeforeFirst () возвращает true
cursor.isAfterLast () возвращает true

Так что да, первый фрагмент кода, который вы разместили, будет отлично работать на пустом курсоре.

6 голосов
/ 14 ноября 2011

Я не использую isAfterLast. Я использую следующий шаблон для чтения результата запроса.

    SQLiteDatabase db = new DbHelper().getWritableDatabase();
    String sql = "SELECT ...";
    String[] args = ...;
    Cursor cs = db.rawQuery(sql, args);
    while (cs.moveToNext()) {
        // cs.getXxx(0), cs.getXxx(1)
    }
    cs.close();
    db.close();

DbHelper - это класс, который я расширяю с SQLiteOpenHelper

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