Android&SQLite: CursorIndexOutOfBoundsException при получении одной записи по ID

392
09 февраля 2017, 00:04

Написал метод для получения записи по указанному id:

public NotesData getInboxItemByID(String id){
    db = dbHelper.getReadableDatabase();
    cursor = db.query(DataBaseContract.NotesData.TABLE_NAME, new String[] {DataBaseContract.NotesData._ID},
            DataBaseContract.NotesData._ID + "=?", new String[] {id}, null, null, null);
    int idColInd = cursor.getColumnIndex(DataBaseContract.NotesData._ID);
    int dateAndTimeColInd = cursor.getColumnIndex(DataBaseContract.NotesData.COLUMN_DATETIME);
    int titleColInd = cursor.getColumnIndex(DataBaseContract.NotesData.COLUMN_TITLE);
    int noteTextColInd = cursor.getColumnIndex(DataBaseContract.NotesData.COLUMN_NOTE);
    NotesData notesData = new NotesData(cursor.getString(idColInd),
            cursor.getLong(dateAndTimeColInd), cursor.getString(titleColInd), cursor.getString(noteTextColInd));
    dbHelper.close();
    db.close();
    return notesData;
}

Приложение падает с такой ошибкой:

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

Во-первых, мне не понятно, как такая ошибка возникла: ведь напрямую -1 я не запрашивал. Вероятно, следовало поместить курсор в начало перед выполнением запроса, но он не инициализирован перед запросом.

Answer 1

При получении выборки курсор не спозиционирован ни на какую запись в этой выборке и указатель курсора находится перед первой позицией, поэтому возвращает текущий индекс (позицию указателя в курсоре) = -1. Перед получением данных из курсора нужно установить позицию из которой брать данные (определенная запись) - moveToPosition() или на начало - moveToFirst(). Для итерации по курсору с несколькими записями использовать метод moveToNext() - каждый новый вызов метода перемесит указатель курсора на следующюю запись в выборке

cursor = db.query(DataBaseContract.NotesData.TABLE_NAME, new String[] {DataBaseContract.NotesData._ID},
            DataBaseContract.NotesData._ID + "=?", new String[] {id}, null, null, null);
cursor.moveToFirst();
int idColInd = cursor.getColumnIndex(DataBaseContract.NotesData._ID);
...

перемещать указатель нужно после выполнения запроса, перед запросом курсор не содержит данных и перемещать в нем указатель некуда в принципе.

READ ALSO
Область видимости (класс в классе)

Область видимости (класс в классе)

Есть класс, в конструкторе которого вызывается другой класс, в котором в свою очередь есть публичный геттер, возвращающий значение поля

278
Чем реализовать изменяемый график в JavaFX

Чем реализовать изменяемый график в JavaFX

Требуется сделать следующий график

399
Как сделать чтоб отпрвялся запрос через определенный интервал ??7

Как сделать чтоб отпрвялся запрос через определенный интервал ??7

Есть метод myMethod(); надо его запускать через определенное время допустим 45-60 секунд ,пытался сделать через

317
Java аннотации - реализация бизнес логики

Java аннотации - реализация бизнес логики

Хочу написать свои аннотации, так как возникло несколько идей, но не могу понять как это сделатьВроде легко, но вопрос: как к аннотации прикрепить...

470