2010-06-22 23 views
13

La siguiente función me está dando fuera de límites excepción ...Android SQLite cursor fuera de los límites de excepción SELECT count (*) FROM tabla

public void count(){ 
    SQLiteDatabase db = table.getWritableDatabase(); 
    String count = "SELECT count(*) FROM table"; 
    Cursor mcursor = db.rawQuery(count, null); 
    int icount = mcursor.getInt(0); 
    System.out.println("NUMBER IN DB: " + icount); 
} 

Es la intención de devolver el número de filas en la base de datos . ¿Alguien sabe qué está mal? ¿Acaso estoy haciendo esta tarea de la manera incorrecta?

Respuesta

48

se ha perdido a cabo

mcursor.moveToFirst(); 

public void count(){ 
    SQLiteDatabase db = table.getWritableDatabase(); 
    String count = "SELECT count(*) FROM table"; 
    Cursor mcursor = db.rawQuery(count, null); 
    mcursor.moveToFirst(); 
    int icount = mcursor.getInt(0); 
    System.out.println("NUMBER IN DB: " + icount); 
} 

pero debería utilizar métodos mejores para esta tarea, al igual que los ayudantes incorporadas de DatabaseUtils

como

public long count() { 
    return DatabaseUtils.queryNumEntries(db,'tablename'); 
} 

Puede que le resulte útil usar DatabaseUtils.longForQuery() para obtener el primer valor de la columna larga, cuando tienes la consulta para el recuento total. Es más simple y no necesitas ese montón de trabajo con el Cursor.

+0

que funcionaba, gracias :) – Skizit

+0

Aidan, debe hacer clic en la marca "marcar" si siente que esta es la respuesta correcta. –

+0

Interesante - Hubiera esperado crear un nuevo Cursor que lo moviera al primer registro en lugar de "antes que el primero" - es bueno saber que Android también agrega ese concepto (estoy más acostumbrado a tener solo un "último"). Preguntándose también, ¿qué es mejor, hacer esto (lo esperaría), o 'SELECT * FROM table' y luego' getCount() 'en el cursor resultante? – Joubarc

3

necesidad de mover el cursor a la primera fila (y única)

Cursor mcursor = db.rawQuery(count, null); 
mcursor.moveToFirst(); 
int icount = mcursor.getInt(0); 
0

puede utilizar esta opción si desea obtener el número de filas de ID específico o Valor

public int numbersOfrows (int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     int numbersOfrows = 0 ; 

     Cursor c = db.rawQuery("select count(*) from table_name where Column_name = 'yourValue'") 
     if (c.moveToFirst()){ 
      numbersOfrows = c.getInt(0); 
     } 

     return numbersOfrows ; 
    } 
Cuestiones relacionadas