Написал метод для получения записи по указанному 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 я не запрашивал. Вероятно, следовало поместить курсор в начало перед выполнением запроса, но он не инициализирован перед запросом.
При получении выборки курсор не спозиционирован ни на какую запись в этой выборке и указатель курсора находится перед первой позицией, поэтому возвращает текущий индекс (позицию указателя в курсоре) = -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);
...
перемещать указатель нужно после выполнения запроса, перед запросом курсор не содержит данных и перемещать в нем указатель некуда в принципе.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости