2016-04-18 39 views
5

Ho un'app che utilizza un cursore per eseguire una query SQlite.L'app si arresta in modo anomalo se il cursore SQLite non ha risultati

public Cursor totaltrips(){ 
    Cursor cursor = database.rawQuery("SELECT * AS TTotal FROM " + DatabaseHelper.TABLE_NAME, null); 
    return cursor; 
} 

I risultati vengono archiviati in un Arraylist con un massimo di 5 valori. Se non ci sono record nel database, l'app si arresta in modo anomalo. Se ho una o più voci del database, funziona bene. Qualcuno sa come posso impedirgli di andare in crash quando non ci sono voci del database?

// get column value 
    if (Distance.moveToNext()) 
     result = String.valueOf(Distance.getDouble(Distance.getColumnIndex("myTotal"))); 

    tnmView.setText(result); 

    List<String> distancearray = new ArrayList<String>(); 
    Cursor cursor = dbManager.totaldistance(); 


    do{ 
     distancearray.add(cursor.getString(1)); 
    }while ((cursor.moveToNext())); 
    ttrips = cursor.getCount(); 
    Log.i("Graph", "TTRIPS = " + ttrips); 

    // Be sure here to have at least the 5 desired elements into the list 
    while(distancearray.size() < 5){ 
     distancearray.add("0"); 
    } 

Arresto anomalo dell'applicazione con l'errore

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

Sulla linea

do{ 
     distancearray.add(cursor.getString(1)); 
    }while ((cursor.moveToNext())); 
+0

prima di poter controllare cursor.getCount()> 0 ... – sector11

+0

è sufficiente aggiungere il ciclo Do While in if/else dichiarazione 'if (curser.getCount()> 0) {// do-while loop here} – Opiatefuchs

+0

basta controllare cursor.getCount()> 0 prima di fare il ciclo – itsa04g9

risposta

7

Controllare se il cursore ha effettivamente risultati, provare qualcosa di simile, per esempio:

int numResults = cursor.getCount(); 
if (numResults > 0) { 
    do { 
     distancearray.add(cursor.getString(1)); 
    } while ((cursor.moveToNext())); 
} 
+0

questa dovrebbe essere la risposta – itsa04g9

+0

Awesome, che funziona benissimo! Grazie! – MarcusRey

1

Sostituire

do{ 
    distancearray.add(cursor.getString(1)); 
}while ((cursor.moveToNext())); 

con

if (cursor != null) { 
    while (cursor.moveToNext()) { 
     distancearray.add(cursor.getString(1)); 
    } 
    cursor.close(); 
} 
1

Verificare cursore è nullo e ha più di un cursore value.Close dopo usi.

if(cursor!=null&&cursor.getCount()>0){ 
cursor.moveToFirst(); 
while(cursor.hasNext()){ 

//do stuff here 
} 

cursor.close(); 
} 
+0

Questo salterà oltre la prima riga. – laalto