2013-08-27 54 views
0

我需要實現一個訪問數據庫的算法來檢查最後一個元素以計算新元素。當然,因爲數據庫是空的,我得到cursor.getCount always = 0

IndexOutOfBoundsException) index 0 requested with a size of 0 

爲了避免它的第一次這將是不可能的,我想檢查是否cursor.getCount==0,然後我介紹一個默認的第一個元素。問題是,即使我將它存儲在數據庫中,cursor.getCount仍然是0。這裏是我的方法的代碼:

public Measures getLastMeasure(String date) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_MEASURES, new String[] { KEY_ID, 
      KEY_DATE, KEY_TIME_HOUR, KEY_TIME_MINUTE, KEY_BE_INTAKE, 
      KEY_GLUCOSE, KEY_BOLUS, KEY_BASAL }, KEY_DATE + "=?", 
      new String[] { date }, null, null, KEY_TIME_HOUR + " DESC, " 
        + KEY_TIME_MINUTE + " DESC", "1"); 
    if (cursor.getCount() == 0) { 
     Measures m = new Measures("nodate", 0, 0, 0, 0, 0, 0); 
     return m; 
    } else { 
     if (cursor != null) 
      cursor.moveToFirst(); 

     Measures m = new Measures(Long.parseLong(cursor.getString(0)), // id 
       cursor.getString(1), // date 
       Integer.parseInt(cursor.getString(2)), // timeHour 
       Integer.parseInt(cursor.getString(3)), // timeMinute 
       Double.parseDouble(cursor.getString(4)), // BE intake 
       Double.parseDouble(cursor.getString(5)), // glucose 
       Double.parseDouble(cursor.getString(6)), // bolus 
       Double.parseDouble(cursor.getString(7)) // basal 

     ); 
     // return m 
     return m; 
    } 
} 

我希望你能幫助我。在此先感謝大家。

+1

如果你的數據庫中有數據,並且遊標總是返回0行,也許你的'KEY_DATE +「=?」'過濾器沒有做你期望的操作。 –

回答

0

我可能會錯過一些東西,但該代碼看起來對我來說是正確的。您確定您要查找的數據實際上在數據庫中,並且您傳遞給getLastMeasure()的參數是正確的嗎?

0

看起來您的查詢沒有返回與您的搜索匹配的數據。如果你只是想按日期的最新數據,我建議order by KEY_DATE desclimit 1,或者max(KEY_DATE)代替KEY_DATE + "=?"

邊注:沒有必要檢查是否cursornullSQLiteDatabase#query不會返回空值Cursor),反正你的支票是沒用的因爲你正在訪問cursor,即使它是null。你也沒有關閉Cursor

+0

以及我應該在哪裏關閉它?這是我第一次使用遊標工作...... – JP88

+0

順便說一句,max()方法不存在 – JP88

+0

在從方法返回之前關閉遊標。這就是爲什麼我更喜歡在這種方法中只有一次回報。你可以修改你的代碼,使得只有一個return語句具有相同的行爲(通常也只有一個return語句使得該方法更具可讀性,因爲退出點只有一個)。我的意思是[SQLite max()函數](http://www.sqlite.org/lang_corefunc.html)。 – m0skit0

相關問題