2012-04-20 24 views
37

Estoy usando adaptador personalizado que extiende 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á mostrandoandroid.database.CursorIndexOutOfBoundsException: Índice 0 solicitado, con un tamaño de 0

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

mientras se coloca en el depurador el método no se va después de la línea

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

puede cualquiera que me ayude 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; 
} 

Respuesta

7

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

15

probar esto .. esto evitará una excepción ser lanzado cuando el cursor está vacío ..

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

este código funciona para mí ... Sí que quería exactamente eso. –

+2

Este código se bloqueará en cursor.close() si el cursor es nulo. – Mark

+0

¿Es igualmente bueno comprobar 'if (cursor.getCount()! = 0)'? –

91

Cada vez que usted está tratando con los cursores, compruebe siempre que nulo y comprobar si hay moveToFirst() sin falta.

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

Coloque los troncos adecuadamente para ver si se está volviendo null o un cursor vacío. De acuerdo con eso, verifica tu consulta.

Actualización Ponga ambas comprobaciones en una sola declaración como lo menciona Jon en el comentario siguiente.

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

+2

Debido a la evaluación perezosa de Java de '&&', simplemente puede hacer 'if (cursor! = Null && cursor.moveToFirst()) {...}' –

+1

Gracias por señalarlo. lo actualicé :) – Shubhayu

+0

Muchas gracias @Shubhayu Resolvió mi problema. – indraja

4

Parada esquema 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(); 
} 
10

En primer lugar comprobar esta condición antes de captación de datos

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