Что такое использование moveToFirst() в SQLite Cursors
Я новичок в программировании
и я нашел этот кусок кода в Интернете, и он отлично работает
Cursor c=db.query(DataBase.TB_NAME, new String[] {DataBase.KEY_ROWID,DataBase.KEY_RATE}, DataBase.KEY_ROWID+"= 1", null, null, null, null);
if(c!=null)
{
c.moveToFirst();
}
но я не могу понять использование
if(c!=null)
{
c.moveToFirst();
}
часть. Что он делает точно, и если я удалю
if(c!=null) { c.moveToFirst(); }
код не работает.
Ответы
Ответ 1
Документы для SQLiteDatabase.query() говорят, что методы запроса возвращаются:
"Объект курсора, который помещается перед первой записью.
Вызов moveToFirst()
выполняет две функции: позволяет проверить, вернул ли запрос пустой набор (путем проверки возвращаемого значения), и он перемещает курсор в первый результат (когда набор не пуст). Обратите внимание, что для защиты от пустого набора возвращаемых значений код, который вы опубликовали, должен тестировать возвращаемое значение (которое оно не делает).
В отличие от вызова moveToFirst()
, тест для if(c!=null)
бесполезен; query()
будет либо возвращать объект Cursor
, либо генерирует исключение. Он никогда не вернет null
.
Ответ 2
if (c.moveToFirst()) {
while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG
...
c.moveToNext();
}
}
Ответ 3
Курсор не является строкой результата запроса. Курсор - это объект, который может перебирать строки результатов вашего запроса. Курсор может перемещаться в каждую строку. .moveToFirst()
переместите его в первую строку таблицы результатов.
Ответ 4
Метод moveToFirst() перемещает курсор в первую строку. Это позволяет выполнить проверку, возвращен ли запрос пустой набор или нет. Вот пример его реализации,
if (cursor.getCount() == 0 || !cursor.moveToFirst()) {
return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN));
cursor.close();
Ответ 5
что macio.Jun говорит правильно!
у нас есть код, как показано ниже:
String sql = "select id,title,url,singer,view,info from cache where id=" + id;
SQLiteDatabase db = getMaintainer().getReadableDatabase();
Cursor query = db.rawQuery(sql, null);
query.moveToFirst();
while(query.moveToNext()){
DBMusicData entity = new DBMusicData();
entity.setId(query.getString(query.getColumnIndex(FIELD_ID)));
entity.setTitle(query.getString(query.getColumnIndex(FIELD_TITLE)));
entity.setSinger(query.getString(query.getColumnIndex(FIELD_SINGER)));
entity.setTitlepic(query.getString(query.getColumnIndex(FIELD_PICURL)));
entity.setInfoUrl(query.getString(query.getColumnIndex(FIELD_INFO)));
entity.setViews(query.getString(query.getColumnIndex(FIELD_VIEW)));
Log.w(tag, "cache:"+ entity.toString());
}
query.close();
query=null;
db.close();
db=null;
Если в таблице кэша имеется только одна запись, query.moveToFirst(); приведет к тому, что запись не вернется.