将值插入Database - Android时,光标超出范围异常

时间:2011-04-30 10:36:35

标签: android database sqlite

我正在尝试将光标中的值插入到我的数据库中,但是我收到了错误。

这就是我的工作 -

    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不是空的。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题是moveToNext()在您已经定位在最后一个元素之后返回false并希望更进一步。有效位置的范围从-1到elementCount,因此最后一个位置是合法的,但没有元素。如果光标有两个位置,那么这就是你的代码中真正发生的事情:

  1. 您调用moveToFirst(),光标位于索引为0的第一个元素。
  2. 您阅读了这些数值并致电moveToNext()。移动成功,您位于索引1。
  3. 您阅读了这些数值并致电moveToNext()。移动成功,您位于索引2,这超出了最后一个元素。
  4. 您尝试读取值并失败,因为没有索引为2的元素。
  5. 您需要做的是:

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        //Read the contents
        cursor.moveToNext(); //Advance to the next element
    }