Подтвердить что ты не робот

Случайное исключение android.database.sqlite.SQLiteException: невозможно открыть файл базы данных

В моем приложении используется обработчик неперехваченных исключений, который отправляет мне трассировку стека при сбое приложения. Часто я получаю этот отчет от случайных пользователей.

Я не могу его реплицировать, открытие базы данных всегда выполняется в моем случае. Это не база данных, хранящаяся на внешней SD-карте, а только база данных, открытая с помощью SQLiteOpenHelper(context, "SomeName", null, someVersionCode).

Есть ли у вас опыт в этом? Какие возможности я могу проверить перед открытием базы данных?

Спасибо!

android.database.sqlite.SQLiteException: unable to open database file
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4363)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: unable to open database file
    at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1698)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739)
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:761)
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:754)
    at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:476)
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

попробуйте синхронизированный метод для открытия метода database.synchronized, который не позволит одновременно открывать базу данных из нескольких потоков. введите ниже код в свой dbHelper

private synchronized SQLiteDatabase getWritableDB() {
        //get your database and return it from this method.
}

и вызовите этот метод, когда вы получаете db. Надеюсь, это поможет.

Ответ 4

@yuku

Этот вопрос, с которым я столкнулся, решил эту проблему таким же образом.

  • Нам нужно проверить, является ли старая база данных такой же, как Новая база данных. Если что-то изменилось на новую базу данных, нам понадобится удалить Старая база данных strong > и установите новую базу данных ИЛИ измените таблицу в соответствии с новой базой данных

  • Второй вариант - просто удалить ваше старое приложение и установить новое приложение

Надеюсь, это сработает для вас..!!!

Ответ 5

Для любого приложения базы данных я создаю базу данных sqlite сначала с помощью аддона Firefox Sqlite Manager и переношу его в /res/raw папку. Затем в моем коде я проверяю, существует ли база данных в /data/data для этого приложения. Если нет, я копирую файл db в этот каталог с помощью моего кода.

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

SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);  

Возможно, я мог бы попытаться помочь, если вы покажете свои фрагменты кода. Ну, мои методы описаны здесь, вы можете посмотреть, если это поможет.

Заполнение базы данных SQLite

Ответ 6

Я столкнулся с этой проблемой.

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

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

Что я сделал,

Я только что написал код для копирования базы данных в фоновый поток и показ заставки для пользователя до тех пор, пока база данных времени не будет скопирована только после этого, показывая следующий экран.

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

Ответ 7

Переустановите приложение и попробуйте использовать синхронизированный блок для операций с базой данных CURD:)