2010-06-22 18 views
13

Poniższa funkcja daje mi poza granicami wyjątkiem ...Android SQLite kursora poza granicami wyjątek select count (*) FROM tabela

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

To oznaczało powrót liczbę wierszy w bazie danych . Ktoś wie co jest nie tak? czy może wykonuję to zadanie w niewłaściwy sposób?

Odpowiedz

48

przegapiłeś

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

Ale należy użyć lepszych sposobów realizacji tego zadania, jak wbudowanych pomocników DatabaseUtils

takich jak

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

Może się okazać pomocne w użyciu DatabaseUtils.longForQuery() aby uzyskać wartość pierwszej kolumny, gdy masz zapytanie o całkowitą liczbę. Jest to prostsze i nie potrzebujesz tej pracy z Cursorem.

+0

który pracował, dzięki :) – Skizit

+0

Aidan, powinieneś kliknąć znak "tick", jeśli uważasz, że to właściwa odpowiedź. –

+0

Interesujące - spodziewałem się, że stworzenie nowego kursora przeniesie go do pierwszego rekordu, zamiast "przed pierwszym" - dobrze wiedzieć, że Android również dodaje tę koncepcję (jestem bardziej przyzwyczajony do posiadania "ostatniego"). Zastanawiasz się również, co jest lepsze, robiąc to (tak bym się tego spodziewał), lub 'SELECT * FROM table', a następnie' getCount() 'na wynikowym kursie? – Joubarc

3

trzeba przesunąć kursor do pierwszego (i jedynego) wiersza

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

można użyć tego, jeśli chcesz uzyskać liczbie wierszy szczegółowego ID lub wartość

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 ; 
    } 
Powiązane problemy