Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更新数据库时发生CursorIndexOutOfBoundsException_Android_Database_Sqlite_Android Sqlite - Fatal编程技术网

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中,看看是否打印出来。