Проблема в том, что у Курсора есть только 8 (смещения 0-7) из 11 (смещений 0-10) столбцов в таблице.Следовательно, сообщение о том, что ему не удалось прочитать строку 0 (первая строка), столбец 8 (9-й столбец (местоположение)).
Курсор будет содержать только те столбцы, которые вы указали неявно или явно (SELECT *)подразумевает все столбцы, ноль в качестве второго параметра в методе запроса SQLIteDatabase приравнивается к SELECT * и, следовательно, подразумевает все столбцы).Это независимо от столбцов в базовой таблице или таблицах.
Может показаться, что массив String, переданный классу поставщика в качестве 2-го параметра (проекция), только явно указывает 8 столбцов.
Быстрое исправление (хотя и наиболее гибкое) заключается в использовании null вставка проекция в качестве второго параметра при вызове метода SQLiteDatabase query .
Таким образом, вместо: -
database.query(AlarmReminderContract.AlarmReminderEntry.TABLE_NAME, projection, selection, selectionArgs,
null, null, sortOrder);
Вы можете использовать: -
database.query(AlarmReminderContract.AlarmReminderEntry.TABLE_NAME, null, selection, selectionArgs,
null, null, sortOrder);
Таким образом, весь метод запроса может быть: -
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
SQLiteDatabase database = mDbHelper.getReadableDatabase();
// This cursor will hold the result of the query
Cursor cursor = null;
int match = sUriMatcher.match(uri);
switch (match) {
case REMINDER:
cursor = database.query(AlarmReminderContract.AlarmReminderEntry.TABLE_NAME,
null, //<<<<<<<<<< CHANGED
selection,
selectionArgs,
null, null, sortOrder);
Log.i("msg","Reminder Invoked");
break;
case REMINDER_ID:
selection = AlarmReminderContract.AlarmReminderEntry._ID + "=?";
selectionArgs = new String[] { String.valueOf(ContentUris.parseId(uri)) };
cursor = database.query(AlarmReminderContract.AlarmReminderEntry.TABLE_NAME,
null, //<<<<<<<<<< CHANGED
selection,
selectionArgs,
null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("Cannot query unknown URI " + uri);
}
}
- Обратите внимание, что второй параметр
String[] projection
, переданный методу, будет избыточным.
Альтернативой может быть изменение вызова метода класса класса поставщика.(как указано выше), чтобы передаваемый массив String включал дополнительные столбцы при вызове метода query класса провайдера.
например,
String[] projection_columns = new String[]{
AlarmReminderContract.AlarmReminderEntry._ID,
AlarmReminderContract.AlarmReminderEntry.KEY_TITLE,
AlarmReminderContract.AlarmReminderEntry.KEY_DATE,
AlarmReminderContract.AlarmReminderEntry.KEY_TIME,
AlarmReminderContract.AlarmReminderEntry.KEY_REPEAT,
AlarmReminderContract.AlarmReminderEntry.KEY_REPEAT_NO,
AlarmReminderContract.AlarmReminderEntry.KEY_REPEAT_TYPE,
AlarmReminderContract.AlarmReminderEntry.KEY_LOCATION,
AlarmReminderContract.AlarmReminderEntry.KEY_ACTIVE,
AlarmReminderContract.AlarmReminderEntry.latitude,
AlarmReminderContract.AlarmReminderEntry.longitude
}
your_provider.query(your_uri, project_columns,your_selection, your_selectionargs, you_sortorder);