Почему я получаю сообщение об ошибке после удаления одной строки из таблицы sqlite для Android - PullRequest
0 голосов
/ 07 ноября 2018

После удаления строки из моей базы данных sqlite я всегда получаю сообщение об ошибке, если просматриваю предыдущие строки и сталкиваюсь с удаленной строкой. кажется, что данные удалены, однако _id все еще существует. вот мой код:

this.database = openHelper.getWritableDatabase();
    String table = "flash_table";
    String whereClause = "Chap_ID=? AND Flash_Chap_Rank =?" ;
    String whereArgs[] = new String[] {""+cid, ""+fid};
    database.delete(table, whereClause, whereArgs);
    database.execSQL("UPDATE SQLITE_SEQUENCE SET seq = (SELECT MAX('Flash_ID')-1)  WHERE name = 'flash_table';");

вот сообщение об ошибке:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.newapp.flash, PID: 2579
              android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
                  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
                  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:151)
                  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:65)

Может ли кто-нибудь помочь преодолеть эту проблему.

1 Ответ

0 голосов
/ 07 ноября 2018

Вы пытаетесь прочитать строку из Курсора, когда в Курсоре нет строк (вы, скорее всего, удалили одну строку и, следовательно, в таблице нет строк для извлечения).

Типичная причина этого - когда выполняется бесполезная проверка на нулевое значение курсора, например,

if (cursor != null) { 
    cursor.moveToFirst(); 
    cursor.getString(0); //<<<<<<<<< FAIL if cursor is empty
}

Это приведет к ошибке выше, если в курсоре нет строк.

Это связано с тем, что курсор, возвращаемый методом SQLiteDatabase (например, query или rawQuery ), никогда не будет нулевым. Действительный курсор будет возвращен.

Метод moveToFirst не дает сбоя, вместо этого он возвращает false, если перемещение не может быть выполнено, если курсор находится в позиции перед первой строкой .

Поэтому, когда вы пытаетесь получить данные из Курсора, возникает исключение, в котором говорится, что нет строк (размер равен 0), чтобы вы могли получить данные из столбца со смещением 0.

Исправление - проверка возврата с moveToFirst. например (вместо вышеуказанного кода)

if (cursor.moveToFirst()) {
    cursor.getString(0);
}
  • Обратите внимание, что это типичный код, который дает сбой, есть другие способы, но в основном любой из перемещения курсора? методы должны быть проверены на возвращаемое значение. Метод Cursor getCount () также можно использовать для проверки наличия строк в курсоре.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...