2010-06-22 3 views
13

La fonction suivante me donne une sortie d'exception des limites ...Android SQLite curseur hors limites exception sur SELECT COUNT (*) FROM table

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

Il est destiné à retourner le nombre de lignes dans la base de données . Quelqu'un sait ce qui ne va pas? est-ce que je fais peut-être cette tâche dans le mauvais sens?

Répondre

48

Vous avez manqué

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

Mais vous devriez utiliser de meilleures méthodes pour cette tâche, comme les aides encastrables de DatabaseUtils

tels que

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

Vous trouverez peut-être utile d'utiliser DatabaseUtils.longForQuery() pour obtenir la valeur longue de la première colonne, lorsque vous avez une requête pour le nombre total. C'est plus simple et vous n'avez pas besoin de beaucoup de travail avec le curseur.

+0

Cela a fonctionné, merci :) – Skizit

+0

Aidan, vous devez cliquer sur le "tick" marque si vous sentez que c'est la bonne réponse. –

+0

Intéressant - Je m'attendais à créer un nouveau Cursor le déplacer vers le premier enregistrement au lieu de "avant le premier" - bon à savoir Android ajoute aussi ce concept (je suis plus habitué à avoir seulement un "après dernier"). Vous vous demandez aussi, quoi de mieux, faire cela (je m'y attendais), ou 'SELECT * FROM table' et ensuite' getCount() 'sur le curseur résultant? – Joubarc

3

besoin de déplacer le curseur sur le premier (et seulement) rangée

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

vous pouvez utiliser si vous voulez obtenir le nombre de lignes pour ID spécifique ou la valeur

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