Android-образ диска базы данных искажен
В моем приложении Android я получаю "образ диска базы данных искажен"
Каковы причины получения этой ошибки?
не закрыт db? несколько потоков, обращающихся к db? или андроид просто испорчен?
Спасибо
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)
...
Ответы
Ответ 1
Я столкнулся с множеством случаев, когда люди сообщали о проблемах с sqlite-коррупцией на Android. В большинстве случаев это связано с убийцей задачи, но по-прежнему остается небольшой запас людей, которые по-прежнему испытывают случайное повреждение SQLite.
Например, эта проблема:
http://code.google.com/p/android/issues/detail?id=4866
Ссылки JRL выше также очень полезны для понимания того, какие типы событий могут привести к повреждению образа SQLite DB.
Кроме того, сам SQLite был исправлен в новейшей истории для разрешения различных (редких) сценариев коррупции данных. См. http://www.sqlite.org/changes.html. Таким образом, версия SQLite, поставляемая с Android, не самая последняя, но по мере развития Android, так же как и приложения, связанные с ней, например SQLite.
В конце концов, только так мы можем сделать программисты для защиты от коррупции SQLite, поэтому иногда выгодно использовать механизмы безопасности кода в наших приложениях, такие как периодические резервные копии БД на SDCard (что я и делаю).
Ответ 2
Ошибка передается из собственного кода в Java, поэтому вам нужно посмотреть возможные причины повреждения SQLite. Здесь веб-страница на веб-сайте SQLite, в которой перечислены сообщения из-за ошибок в SQLite, а здесь еще один под названием Как повредить вашу базу данных.
Ответ 3
Исправлено в версии 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 признал, что вторая строка была удалена, поэтому он прерывает второй цикл, но не смог правильно очистить его, что могло бы привести к повреждению базы данных при последующих циклах цикла.