我正在尝试将光标中的值插入到我的数据库中,但是我收到了错误。
这就是我的工作 -
Cursor getUserDrinks = myDbHelper.getUserDrinks();
if(getUserDrinks != null)
{
if (getUserDrinks.moveToFirst()){
do{
ContentValues initialValues = new ContentValues();
initialValues.put("code", getUserDrinks.getInt(getUserDrinks.getColumnIndex("code")));
initialValues.put("imgstr", getUserDrinks.getString(getUserDrinks.getColumnIndex("imgstr")));
initialValues.put("name", getUserDrinks.getString(getUserDrinks.getColumnIndex("name")));
initialValues.put("alc", getUserDrinks.getDouble(getUserDrinks.getColumnIndex("alc")));
initialValues.put("user", 1);
try {
myDataBase.beginTransaction();
myDataBase.insert("drinks", null, initialValues);
myDataBase.setTransactionSuccessful();
}
finally {
myDataBase.endTransaction();
}
}while(getUserDrinks.moveToNext());
}
}
但它给了我一个CursorIndexOutOfBoundsException。这是日志 -
04-30 13:22:35.363: ERROR/AndroidRuntime(19161): java.lang.RuntimeException: Unable to start activity ComponentInfo{android.alco/android.alco.main}: android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2
我知道Cursor不是空的。
我做错了什么?
答案 0 :(得分:1)
问题是moveToNext()
在您已经定位在最后一个元素之后返回false
并希望更进一步。有效位置的范围从-1到elementCount
,因此最后一个位置是合法的,但没有元素。如果光标有两个位置,那么这就是你的代码中真正发生的事情:
moveToFirst()
,光标位于索引为0的第一个元素。moveToNext()
。移动成功,您位于索引1。moveToNext()
。移动成功,您位于索引2,这超出了最后一个元素。您需要做的是:
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
//Read the contents
cursor.moveToNext(); //Advance to the next element
}