У меня есть приложение, которое позволяет пользователю сохранять файлы базы данных приложения 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/... Интересно, может ли это быть связано? В любом случае, после допроса пользователя, я, по крайней мере, знаю, что это одна конкретная таблица в файле базы данных, которая имеет проблему. Различные части моего приложения взаимодействуют с разными таблицами в файле базы данных. Приложение прекрасно работает и позволяет ему сохранять/читать данные, когда он обращается к другим таблицам, но когда он обращается к одной конкретной таблице, просто попытка открыть файл вызывает его ошибку. Я думаю, что могу добавить уродливое исправление, которое улавливает это исключение, если оно происходит, а затем отбрасывает поврежденную таблицу и затем воссоздает ее. Мысли?
У меня также есть приложение с (довольно небольшим) 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-карты связано с этим так или иначе?