Повреждение файла базы данных Android

1

У меня есть приложение, которое позволяет пользователю сохранять файлы базы данных приложения SQLite на SD-карту. Эта функция существует уже более года и отлично работает. У меня были пользователи, которые отправили мне по электронной почте свои файлы базы данных в тех случаях, когда произошла ошибка, которую я не смог воспроизвести.

Недавно пользователь отправил мне свои файлы базы данных, и когда я попытался загрузить их в свое приложение (поместив их в папку с файлом приложения), приложение разбилось при попытке открыть файл базы данных. Этот пользователь отправил мне свои файлы раньше, чем без проблем.

Единственными отличиями между моим приложением и тогда являются: 1) Я добавил функциональность приложения-2-SD и 2) Мое приложение нацелено на 2,2 сейчас против 1,6 (тогда 1.5 - это версия SDK в обоих случаях).

Пользователь сказал, что он разместил приложение на SD-карте, а затем приложение начало сбой. Он даже не дает ему возможность отправлять отчет об ошибке.

Когда я разместил его файлы в эмуляторе, я получил следующую трассировку стека:

11-09 22:32:04.275: ERROR/AndroidRuntime(757): Caused by: android.database.sqlite.SQLiteException: file is encrypted or is not a database
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1636)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1586)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168)

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

Обновление В случае, если это имеет значение, я узнал от пользователя, что его телефон HTC Evo 4G. Я думал, что где-то читал что-то о зашифрованных файлах базы данных в более поздних версиях Android, где файлы базы данных хранятся в /data/secure/... а не /data/data/... Интересно, может ли это быть связано? В любом случае, после допроса пользователя, я, по крайней мере, знаю, что это одна конкретная таблица в файле базы данных, которая имеет проблему. Различные части моего приложения взаимодействуют с разными таблицами в файле базы данных. Приложение прекрасно работает и позволяет ему сохранять/читать данные, когда он обращается к другим таблицам, но когда он обращается к одной конкретной таблице, просто попытка открыть файл вызывает его ошибку. Я думаю, что могу добавить уродливое исправление, которое улавливает это исключение, если оно происходит, а затем отбрасывает поврежденную таблицу и затем воссоздает ее. Мысли?

  • 0
    Хорошо, вы можете проверить этот файл с помощью любого инструмента SQLite, попробуйте открыть этот файл базы данных в инструменте SQLite и посмотреть, получаете ли вы правильные данные в нем.
  • 0
    Это именно первое, что я попробовал. Когда я открыл файл в SQLite, там ничего не было. Он не показывает мои таблицы, как таблицы были построены и т. Д. Ничего не было в файле, хотя файл не был 0 байтов.
Показать ещё 2 комментария
Теги:
database

1 ответ

0

У меня также есть приложение с (довольно небольшим) db, и в последнее время я получаю отчеты о сбоях из-за проблем с db, которые я не мог воспроизвести.

Играя с моим приложением и действительно подталкивая его, наконец, вызывают сбои.

Причина в моем случае заключалась в том, что из-за many fast opening/closing/update requests, interruption of the app, language changes during the app, etc so the system somehow corrupted the db.

Реализованное мной решение -

a. close/reopen the db often to avoid problems 

b. have a consistency-check routine for every save or retrieve of data now - lots of overhead - but that cleared it fo me so far...

ps Я не получил такой же отчет о сбоях, хотя и ваш. Теперь у меня есть пара разных телефонов Android на моем столе для тестирования и почти никогда не попадала в нее с новейшими high-end. Эти проблемы, как представляется, происходят чаще с меньшими объемами памяти/медленными скоростями, чем с быстрыми high-end. - но, честно говоря, я все еще смущен этим!... возможно, использование SD-карты связано с этим так или иначе?

  • 0
    Благодарю. Я закрываю / открываю базу данных каждый раз, когда мне нужен доступ, но у меня нет проверки целостности. Мне нужно разобраться в этом. Как вы настроили свои чеки? Что-то вроде обертывания блоков try-catch вокруг операторов открытия / сохранения базы данных и оповещения пользователя о проблемах в случае обнаружения исключения? Или что-то более глубокое?
  • 0
    Я использую try-catch с проверками согласованности, чтобы убедиться, что нет недопустимых данных. Если мне удается найти инвазивные данные, я использую определенные значения по умолчанию для замены недопустимых значений. В моем случае это возможно, и я не обязан информировать пользователя. Он может быть просто удивлен, что некоторые сохраненные значения потеряны - но это можно простить. Кстати, мне приходится дублировать один и тот же код для этого во всех моих действиях, чтобы они могли легко реагировать в этих случаях - однако, это может быть не лучшим подходом .. Удачи - опять же - никто не знает, действительно ли это решение, к несчастью

Ещё вопросы

Сообщество Overcoder
Наверх
Меню