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

Solutions Collecting From Web of "Android.database.CursorIndexOutOfBoundsException: запрашивается индекс 0 с размером 0"

Всякий раз, когда вы имеете дело с курсорами, ВСЕГДА проверяйте значение null и обязательно проверяйте moveToFirst() .

 if( cursor != null && cursor.moveToFirst() ){ num = cursor.getString(cursor.getColumnIndex("ContactNumber")); cursor.close(); } 

Расположите журналы соответствующим образом, чтобы увидеть, возвращает ли он null или пустой курсор. В соответствии с этим проверьте ваш запрос.

Обновление Поместите обе чеки в один оператор, как упоминал Джон в комментарии ниже.

Обновление 2 Поместите вызов close() в допустимую область курсора.

Попробуйте это. Это позволит избежать исключения, когда курсор пуст.

 if(cursor != null && cursor.moveToFirst()){ num = cursor.getString(cursor.getColumnIndex("ContactNumber")); cursor.close(); } 

Сначала проверьте это условие перед извлечением данных.

 if(cursor!=null && cursor.getCount()>0){ cursor.moveToFirst(); num = cursor.getString(cursor.getColumnIndex("ContactNumber")); } 

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

Схема сохранения для запроса Cursor s

 // 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(); } 

Если люди все еще ищут:

Вместо поиска "ContactNumber" попробуйте найти Phone.NUMBER . Учебник содержит код с более подробной информацией: http://developer.android.com/training/basics/intents/result.html