Что такое использование moveToFirst() в SQLite Cursors - программирование
Подтвердить что ты не робот

Что такое использование 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(); }

код не работает.

4b9b3361

Ответ 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(); приведет к тому, что запись не вернется.