Подтвердить что ты не робот

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;
}
4b9b3361

Ответ 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