2013-08-27 3 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 desc и limit 1 или max(KEY_DATE) вместо KEY_DATE + "=?"

примечание стороны: нет необходимости проверять, если cursor не null (SQLiteDatabase#query никогда не возвращает нулевой Cursor), и в любом случае чек бесполезно потому что вы получаете доступ к cursor, даже если это null. Также вы не закрываете Cursor.

+0

и где его закрыть? это первый раз, когда я работаю с курсорами ... – JP88

+0

Кстати, метод max() не существует – JP88

+0

Закройте курсор перед возвратом из метода. Вот почему я также предпочитаю иметь только один возврат такого метода. Вы можете изменить свой код, чтобы иметь то же поведение, что и один оператор return (также обычно имеющий только один оператор return, делает этот метод более удобочитаемым, поскольку точка выхода является только одной). Я имею в виду функцию [SQLite max()] (http://www.sqlite.org/lang_corefunc.html). – m0skit0