Pregunta La aplicación se bloquea si el cursor SQLite no tiene resultados


Tengo una aplicación que usa un cursor para ejecutar una consulta SQlite.

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

Los resultados se almacenan en un Arraylist con un máximo de 5 valores. Si no hay registros en la base de datos, la aplicación falla. Si tengo una o más entradas de base de datos, funciona bien. ¿Alguien sabe cómo puedo evitar que se bloquee cuando no hay entradas de la base de datos?

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

La aplicación se bloquea con el error

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

En la línea

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

5
2018-04-18 12:46


origen


Respuestas:


Compruebe si el cursor realmente tiene resultados, intente algo como esto, por ejemplo:

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

7
2018-04-18 12:51



Reemplazar

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

con

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

1
2018-04-18 12:58



Compruebe si el cursor es nulo y tiene más de un valor. Cierre el cursor después de los usos.

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

//do stuff here
}

cursor.close();
}

1
2018-04-18 13:02