2013-07-20 4 views
1

Это ошибка я получаю:CursorIndexOutOfBoundsException при обновлении базы данных

07-20 11:04:45.564: E/AndroidRuntime(1905): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dosemanager1.ui/com.dosemanager.ui.ActivityDisplayMedicineDetails}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

Я хочу, чтобы обновить данные конкретной медицины. Итак, я использую этот код:

public int updateMedicine(MedicineDetails medicine, String oldTitle){ 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_DOSE_NAME, medicine.getDoseName()); 
    values.put(KEY_DOSE_SCHEDULE, medicine.getDoseSchedule().getTimeInMillis()); 
    values.put(KEY_DOSE_REPEAT, medicine.getDoseRepeat()); 
    values.put(KEY_DOSE_FREQUENCY, medicine.getDoseFrequency()); 
    values.put(KEY_DOSE_OTHER_NOTES, medicine.getOtherNotes()); 

    // updating row 
    return db.update(TABLE_MEDICINES, values, KEY_DOSE_NAME + " = ?", 
      new String[] { oldTitle }); 
} 

Теперь он говорит мне, что детали будут обновлены в тосте я сделал в другом месте, но когда я пытаюсь отображением обновленных деталей, я получаю CursorIndexOutOfBounds исключение.

Это мой код для возврата одного MedicineDetails объекта:

public MedicineDetails getSingleMedicine(String title) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Calendar cal = Calendar.getInstance(); 
    Cursor cursor = db.query(TABLE_MEDICINES, new String[] { KEY_ID_DOSE, KEY_DOSE_NAME, KEY_DOSE_SCHEDULE, 
      KEY_DOSE_REPEAT, KEY_DOSE_FREQUENCY, KEY_DOSE_OTHER_NOTES}, 
      KEY_DOSE_NAME + "=?", 
      new String[] { title }, null, null, null); 

    if (cursor != null) 
     cursor.moveToFirst(); 

    cal.setTimeInMillis(cursor.getLong(2)); 
    System.out.println(cal.getTime()); 

    MedicineDetails singleDetail = new MedicineDetails(cursor.getString(1), cal, 
      cursor.getString(3), cursor.getString(4), cursor.getString(5)); 

    return singleDetail; 
} 

Здесь я создал таблицу:

String CREATE_MEDICINES_TABLE = "CREATE TABLE " + TABLE_MEDICINES + "(" 
      + KEY_ID_DOSE + " INTEGER PRIMARY KEY," + KEY_DOSE_NAME + " TEXT,"    
      + KEY_DOSE_SCHEDULE + " INTEGER, " + KEY_DOSE_REPEAT + " TEXT," 
      + KEY_DOSE_FREQUENCY + " TEXT," + KEY_DOSE_OTHER_NOTES + " TEXT" + ");"; 
    db.execSQL(CREATE_MEDICINES_TABLE);  

тот же код работает отлично, чтобы отобразить детали любого лекарства что я НЕ редактировал. Итак, я думаю, что что-то не так с обновлением.

Я прочитал несколько подобных проблем, но ни один из ответов в другом месте не смог решить мою проблему. Какую ошибку я делаю?

+0

первой очереди таблицы проверки базы данных и данных после обновления. то после попытки получить данные и проверить, что курсор не возвращает нулевое значение. я думаю, что его возвращающие нулевые значения. –

ответ

3

Курсор, возвращаемый запросом, может быть пустым, но не нулевым. Если пусто, то moveToFirst() вернет ложь, таким образом, ваш код должен быть

MedicineDetails singleDetail; 
if (cursor.moveToFirst()) 
{ 
    cal.setTimeInMillis(cursor.getLong(2)); 
    System.out.println(cal.getTime()); 

    MedicineDetails singleDetail = new MedicineDetails(cursor.getString(1), cal, 
     cursor.getString(3), cursor.getString(4), cursor.getString(5)); 
} 

return singleDetail; 
+0

Я пробовал это ... теперь я получаю исключение из нормального нулевого указателя: '07-20 11: 43: 13.334: E/AndroidRuntime (2375): java.lang.RuntimeException: не удается запустить Activity ComponentInfo {com .dosemanager1.ui/com.dosemanager.ui.ActivityDisplayMedicineDetails}: java.lang.NullPointerException' –

+0

Это мой модифицированный код: 'if (cursor.moveToFirst()) {... ... ...} else Log.v ("возврат", "null"); return null; ' Проблема в том, что журнал также не печатался! –

+0

В какой строке вы получаете NPE? Вы должны проверить, является ли возвращаемое значение singleDetail нулевым или нет. –

Смежные вопросы