2012-04-20 11 views
37

Sto utilizzando l'adattatore del cursore di estensione dell'adattatore personalizzato per la visualizzazione dei dati in listview, per visualizzare un numero di telefono specifico ho passato l'id a un metodo in classe database ma esso sta mostrandoandroid.database.CursorIndexOutOfBoundsException: indice 0 richiesto, con una dimensione pari a 0

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

pur ponendo debugger nel metodo non sta andando dopo la linea

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

nessuno può aiutarmi a risolverlo. Questo è il codice:

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

risposta

7

Controllare il valore restituito da moveToFirst(), prima di provare a leggere qualcosa dal cursore. Sembra che non vengano restituiti risultati.

15

provare questo .. questo eviterà un'eccezione essere gettati quando il cursore è vuota ..

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

questo codice funziona per me ... volevo proprio che fosse così. –

+2

Questo codice si bloccherà su cursor.close() se il cursore è nullo. – Mark

+0

È ugualmente opportuno controllare 'if (cursor.getCount()! = 0)'? –

91

Ogni volta che avete a che fare con i cursori, SEMPRE controllare nulla e verificare la presenza di moveToFirst() a colpo sicuro.

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

Inserire registri opportunamente per vedere se esso restituisce null o un cursore vuoto. Secondo questo controlla la tua domanda.

Aggiornamento Inserire entrambi i controlli in una singola istruzione come indicato da Jon nel commento qui sotto.

Aggiornamento 2 Inserire la chiamata close() nell'ambito del cursore valido.

+2

A causa della valutazione lazy di Java di '&&', puoi semplicemente fare 'if (cursor! = Null && cursor.moveToFirst()) {...}' –

+1

Grazie per averlo indicato. aggiornato :) – Shubhayu

+0

Grazie mille @Shubhayu Ha risolto il mio problema. – indraja

4

un salvataggio schema per interrogare 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(); 
} 
10

In primo luogo verificare questo Stato prima che i dati che vanno a prendere

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