Исключение курсора за пределами границ при вставке значений в базу данных - Android - PullRequest
0 голосов
/ 30 апреля 2011

Я пытаюсь вставить значения из курсора в свою базу данных, но получаю ошибку.

Вот что я делаю -

    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

Я знаю, что Курсор не пустой.

Что я делаю не так?

1 Ответ

1 голос
/ 30 апреля 2011

Проблема в том, что moveToNext() возвращает false, когда вы уже расположены после последнего элемента и хотите пойти дальше. Диапазон допустимых позиций от -1 до elementCount включительно, поэтому последняя позиция является допустимой, но элемента нет. Это то, что действительно происходит в вашем коде, если курсор имеет две позиции:

  1. Вы вызываете moveToFirst(), курсор находится на первом элементе с индексом 0.
  2. Вы читаете значения и звоните moveToNext(). Движение выполнено успешно, вы находитесь на индексе 1.
  3. Вы читаете значения и звоните moveToNext(). Движение выполнено успешно, вы находитесь в позиции индекса 2, который находится за последним элементом.
  4. Вы пытаетесь прочитать значения и терпите неудачу, поскольку нет элемента с индексом 2.

Что вам нужно сделать, это следующее:

cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    //Read the contents
    cursor.moveToNext(); //Advance to the next element
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...