android.database.CursorIndexOutOfBoundsException: índice 0 solicitado, con un tamaño de 0

Estoy usando adaptadores personalizados que extienden el adaptador de cursor para mostrar datos en listview, para mostrar un número de teléfono particular, he pasado el id a un método en la clase de base de datos pero está mostrando

errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

al colocar el depurador en el método no va después de la línea

 num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 

¿Alguien puede ayudarme a resolverlo? Este es el código:

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

Siempre que moveToFirst() con cursores, SIEMPRE verifique nulo y compruebe si moveToFirst() falla.

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

Coloque los registros apropiadamente para ver si está devolviendo null o un cursor vacío. De acuerdo con eso, verifica tu consulta.

Actualización Coloque ambos controles en una sola statement, como lo menciona Jon en el comentario a continuación.

Actualización 2 Ponga la llamada close() dentro del scope del cursor válido.

intenta esto … esto evitará que se genere una excepción cuando el cursor esté vacío.

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

Primero verifique esta condición antes de obtener datos

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

Compruebe el valor de retorno desde moveToFirst() , antes de intentar leer algo del cursor. Parece que no se están devolviendo resultados.

un esquema de salvar para consultar Cursor s es

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

En caso de que las personas sigan buscando:

En lugar de buscar "ContactNumber" intente buscar Phone.NUMBER . El tutorial tiene el código con más detalles: http://developer.android.com/training/basics/intents/result.html