Android.database.CursorIndexOutOfBoundsException: запрашиваемый индекс 0 с размером 0
Я использую пользовательский адаптер, расширяющий адаптер курсора для отображения данных в списке, для отображения определенного номера телефона. Я передал идентификатор методу в классе базы данных, но он показывает
errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
при размещении отладчика в методе, который не выполняется после строки
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
Может ли кто-нибудь помочь мне решить эту проблему.
Это код:
public String getNumberFromId(int id)
{
String num;
db= this.getReadableDatabase();
Cursor cursor = db.query(scheduletable, new String[] { "ContactNumber" },"_id="+id, null, null, null, null);
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
db.close();
return num;
}
Ответы
Ответ 1
Всякий раз, когда вы имеете дело с курсорами, ВСЕГДА проверяйте значение null и обязательно проверяйте moveToFirst()
.
if( cursor != null && cursor.moveToFirst() ){
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
}
Поместите журналы соответствующим образом, чтобы увидеть, возвращается ли он null
или пустой курсор. В соответствии с этим проверьте ваш запрос.
Обновить Поместите обе чеки в один оператор, как упоминается Джоном в комментарии ниже.
Обновление 2 Поместите вызов close()
в допустимую область курсора.
Ответ 2
попробуйте это.. это позволит исключить исключение, когда курсор пуст.
if(cursor != null && cursor.moveToFirst()){
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
}
Ответ 3
Сначала проверьте это условие перед извлечением данных
if(cursor!=null && cursor.getCount()>0){
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
}
Ответ 4
Проверьте возвращаемое значение с moveToFirst()
, прежде чем пытаться читать что-либо из курсора. Кажется, что результаты не возвращаются.
Ответ 5
Сохранить схему для запроса Cursor
есть
// just one
Cursor cursor = db.query(...);
if (cursor != null) {
if (cursor.moveToFirst()) {
value = cursor.getSomething();
}
cursor.close();
}
// multiple columns
Cursor cursor = db.query(...);
if (cursor != null) {
while (cursor.moveToNext()) {
values.add(cursor.getSomething());
}
cursor.close();
}
Ответ 6
Если люди все еще ищут:
Вместо поиска "ContactNumber"
попробуйте выполнить поиск Phone.NUMBER
. Учебник содержит код с более подробной информацией: http://developer.android.com/training/basics/intents/result.html