Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.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_Android_Database_Sqlite - Fatal编程技术网

将值插入数据库时出现光标越界异常-Android

将值插入数据库时出现光标越界异常-Android,android,database,sqlite,Android,Database,Sqlite,我试图将光标中的值插入数据库,但出现错误 我是这样做的- Cursor getUserDrinks = myDbHelper.getUserDrinks(); if(getUserDrinks != null) { if (getUserDrinks.moveToFirst()){ do{ ContentValues initialValues = new ContentValues()

我试图将光标中的值插入数据库,但出现错误

我是这样做的-

    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());
        }
    }
但它给了我一个粗略的IndexOutofBoundsException。这是日志-

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
我知道光标不是空的


我做错了什么?

问题是
moveToNext()
返回
false
,而您已经定位在最后一个元素之后,并且希望继续。有效位置的范围是从-1到
elementCount
包括在内,因此最后一个位置是合法的,但没有元素。如果光标有两个位置,这就是代码中实际发生的情况:

  • 调用
    moveToFirst()
    ,光标位于索引为0的第一个元素
  • 读取这些值并调用
    moveToNext()
    。移动成功后,您将位于索引1处
  • 读取这些值并调用
    moveToNext()
    。移动成功后,您将位于索引2,该索引超出最后一个元素
  • 您尝试读取值但失败,因为没有索引为2的元素
  • 您需要执行以下操作:

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

    出于某种原因,它无法识别Java代码。如果有人能帮我修一下,我会很感激的,因为我做不好。谢谢如果你想让文本像代码一样处理,你必须在每行的开头加上四个空格。谢谢,这部分奏效了。我现在没有收到错误,但由于某些原因,该值没有插入到数据库中。程序只是继续运行,没有显示错误,但是由于某种原因没有输入值……我想这是另一个问题的主题,现在没有足够的信息来回答它。这部分代码对我来说似乎很好,问题可能出在其他地方。我不确定这是一个不同的问题,因为它仍然没有插入值。事实上没有太多,我没有更多的信息可以提供。我真的不知道在这里该怎么做,因为插入在应用程序的其他部分可以很好地工作。我提到了一个新问题,因为最初的问题基本上是如何正确地遍历游标的内容。至于关于不工作插入的新问题,我不知道表的结构,它们的内容,或者如何检查是否插入了内容。首先应该检查
    myDataBase.insert()返回的内容。此外,也不需要显式地启动和结束事务,这只有在一个事务中执行多个操作时才有意义。