2010-06-22 9 views
13

La funzione seguente mi sta dando un fuori un'eccezione limiti ...Android SQLite Cursore di eccezione limiti sul conteggio SELECT (*) FROM tabella

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

E 'pensata per restituire il numero di righe nel database . Qualcuno sa cosa c'è di sbagliato? sto forse facendo questo compito nel modo sbagliato?

risposta

48

ti sei perso

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

ma si dovrebbe usare metodi migliori per questo compito, come gli aiutanti inbuilt di DatabaseUtils

come

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

Si potrebbe trovare utile usare DatabaseUtils.longForQuery() per ottenere il valore lungo della prima colonna, quando si dispone della query per il conteggio totale. È più semplice e non hai bisogno di quel mucchio di lavoro con il Cursore.

+0

che ha funzionato, grazie :) – Skizit

+0

Aidan, dovresti fare clic sul segno di spunta se ritieni che questa sia la risposta giusta. –

+0

Interessante - mi sarei aspettato di creare un nuovo cursore per spostarlo sul primo record anziché su "prima del primo". Buono a sapersi che Android aggiunge anche questo concetto (sono più abituato ad avere solo un "ultimo"). Chiedendosi anche, cosa c'è di meglio, facendo questo (mi aspetterei di sì), o 'SELECT * FROM table' e quindi' getCount() 'sul cursore risultante? – Joubarc

3

necessità di spostare il cursore sul primo (e unico) di fila

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

è possibile utilizzare questo se si vuole ottenere il numero di righe per ID specifico o Valore

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