2010-06-22 64 views
13

下面的函數給我一個出界異常越界異常的...的Android SQLite的光標出來SELECT COUNT(*)FROM表

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

這意味着要返回數據庫的行數。任何人都知道什麼是錯的?我是否可能以錯誤的方式完成這項任務?

回答

48

你錯過了

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

但是,你應該用更好的方法完成這個任務,就像DatabaseUtils的內置助手

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

您可能會發現有助於使用DatabaseUtils.longForQuery()獲取第一列的長整數值,當你有查詢總數的地方。這很簡單,你不需要使用Cursor這麼多的工作。

+0

這工作的數量,你可以利用這一點,謝謝:) – Skizit 2010-06-22 14:50:00

+0

艾丹,如果你覺得這是正確的答案,你應該點擊「打勾」標記。 – 2010-06-22 14:55:07

+0

有趣的 - 我會期望創建一個新的光標將它移動到第一個記錄,而不是「第一個之前」 - 很好的知道Android也增加了這個概念(我更習慣於只有一個「最後一個」)。想知道的是,有什麼更好的,做到這一點(我期望如此),或者'SELECT * FROM table',然後getCount()'在結果光標上? – Joubarc 2010-06-22 14:56:52

3

需要將光標移動到第一個(也是唯一一個)排

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

,如果你想獲得行的具體ID或價值

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