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

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

Я не могу скопировать его, в моем случае открытие базы данных всегда происходит успешно.Это не база данных, хранящаяся на внешней 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)

Ответы [ 7 ]

5 голосов
/ 18 июля 2011

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

2 голосов
/ 21 октября 2013

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

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

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

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

2 голосов
/ 03 сентября 2010

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

0 голосов
/ 21 октября 2013

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

0 голосов
/ 19 октября 2013

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

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

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

Что я сделал,

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

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

0 голосов
/ 19 октября 2013

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

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

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

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

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

0 голосов
/ 18 октября 2013

@ Yuku

С такой проблемой я столкнулся, я решил эту проблему таким образом.

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

  2. Второй вариант прост: просто удалите старое приложение и затем установите новое приложение

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

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