Android 更新数据库时发生CursorIndexOutOfBoundsException
这就是我得到的错误:Android 更新数据库时发生CursorIndexOutOfBoundsException,android,database,sqlite,android-sqlite,Android,Database,Sqlite,Android Sqlite,这就是我得到的错误: 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
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);
同样的代码可以完美地显示我没有编辑过的任何药物的详细信息。所以,我认为更新有问题
我读过一些类似的问题,但其他地方的答案都不能解决我的问题。
我犯了什么错误?查询返回的游标可能为空,但从不为空。如果它是空的,那么
moveToFirst()
将返回false,因此您的代码应该是空的
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;
首先检查更新后的数据库表和数据。然后尝试获取数据并检查游标是否返回空值。我想它会返回空值。我试过了。。。现在我得到了一个正常的空指针异常:
07-20 11:43:13.334:E/AndroidRuntime(2375):java.lang.RuntimeException:无法启动activity ComponentInfo{com.dosemanager.ui/com.dosemanager.ui.ActivityDisplayMedicineDetails}:java.lang.NullPointerException
这是我修改过的代码:if(cursor.moveToFirst()){………}else Log.v(“返回”、“空”);return null;
问题是日志也没有打印出来!您得到的是哪一行的NPE?您应该检查返回值singleDetail是否为null。不,我知道我输入了一个返回null…因此它必须给出一个异常。但是为什么日志没有打印出来呢?将一个日志放在if中,看看是否打印出来。