Android - образ диска базы данных искажен - PullRequest
15 голосов
/ 02 июня 2010

В моем приложении для Android я получаю "Образ диска базы данных искажен" Каковы причины получения этой ошибки?

не закрыт дБ? несколько потоков, обращающихся к БД? или андроид просто испортился?

Спасибо

android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
   android.database.sqlite.SQLiteQuery.native_fill_window(Native Method)
   android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:75)
   android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:288)
   android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:269)
   android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171)
   android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248)
...

Ответы [ 3 ]

4 голосов
/ 02 июня 2010

Я встречал много случаев, когда люди сообщали о проблемах с коррупцией в sqlite на Android. В большинстве случаев это связано с убийцей задач, но все еще есть небольшая доля людей, все еще испытывающих случайное повреждение SQLite.

Например, эта проблема: http://code.google.com/p/android/issues/detail?id=4866

Ссылки JRL выше также очень полезны для понимания того, какие типы событий могут привести к повреждению образа БД SQLite.

Кроме того, сам SQLite был исправлен в недавней истории для разрешения различных (редких) сценариев повреждения данных. См. http://www.sqlite.org/changes.html. Итак, версия SQLite, поставляемая с Android, не самая последняя, ​​но по мере развития Android развиваются и приложения, связанные с ней, такие как SQLite.

В конце концов, мы, программисты, можем сделать так много, чтобы защитить себя от повреждения SQLite, поэтому иногда полезно использовать механизмы безопасности кода в наших приложениях, такие как периодическое резервное копирование БД на SDCard (это то, что я делаю).

3 голосов
/ 11 апреля 2011

Исправлено в версии 3.5.4 (2007-12-14): Любая операция DELETE или UPDATE, которая использует побочные эффекты для удаления дополнительных строк в той же таблице, которая является предметом DELETE или UPDATE, может привести к повреждению базы данных. Впервые проблема была выявлена ​​в билете № 2832. Но проблема очень старая и затрагивает все версии SQLite по крайней мере до версии 3.3.13 (самая ранняя версия, которую мы проверили).

«Побочный эффект удаления» в предыдущем абзаце означает удаление, которое происходит в результате предложения OR REPLACE или в результате триггера. Например:

   CREATE TABLE ex1(a INTEGER PRIMARY KEY, b);
   INSERT INTO ex1 VALUES(1,2);
   INSERT INTO ex1 VALUES(2,3);
   CREATE TRIGGER ex1_tr1 AFTER UPDATE ON ex1 BEGIN
     DELETE FROM ex1 WHERE a=old.b;
   END;
   UPDATE ex1 SET b=b+1;

В приведенном выше примере первый цикл UPDATE вызывает срабатывание триггера и удаление второй строки таблицы ex1. Когда выполняется второй цикл цикла UPDATE, он пытается обработать вторую строку таблицы ex1. SQLite распознал, что вторая строка была удалена, поэтому он прерывает второй цикл, но не может правильно очистить после себя, что может привести к повреждению базы данных на последующих циклах цикла.

3 голосов
/ 02 июня 2010

Ошибка передается из нативного кода в Java, поэтому вам нужно посмотреть на возможные причины повреждения SQLite. Вот веб-страница на веб-сайте SQLite, на которой перечислены те, которые вызваны ошибками в SQLite, и еще одна под названием Как повредить вашу базу данных .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...