после обновления: «SQLiteException: невозможно открыть файл базы данных»

1

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

(с помощью Android 2.3.3)

Журнал ошибок Почему SQLiteOpenHelper.getWritableDatabase() вызывает это исключение? Конечно, это было бы достаточно умно, чтобы понять: "Ооо, db не существует, пусть создаст его!

обратите внимание, что new SQLiteOpenHelper(context) работал нормально, насколько я могу судить. Однако я не знаю, были ли onCreate() или onUpgrade().

06-04 18:21:01.706 D/AndroidRuntime( 1280): Shutting down VM
06-04 18:21:01.706 W/dalvikvm( 1280): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-04 18:21:01.745 E/AndroidRuntime( 1280): FATAL EXCEPTION: main
06-04 18:21:01.745 E/AndroidRuntime( 1280): java.lang.ExceptionInInitializerError
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at myapp.com.MyActivity.onCreate(MyActivity.java:131)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.os.Looper.loop(Looper.java:130)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.app.ActivityThread.main(ActivityThread.java:3683)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at java.lang.reflect.Method.invokeNative(Native Method)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at java.lang.reflect.Method.invoke(Method.java:507)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at dalvik.system.NativeStart.main(Native Method)
06-04 18:21:01.745 E/AndroidRuntime( 1280): Caused by: android.database.sqlite.SQLiteException: unable to open database file
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:547)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at myapp.com.storage.SQLiteStorage.<init>(SQLiteStorage.java:61)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     at myapp.com.storage.SQLiteStorage.<clinit>(SQLiteStorage.java:58)
06-04 18:21:01.745 E/AndroidRuntime( 1280):     ... 14 more
06-04 18:21:01.776 W/ActivityManager( 1002):   Force finishing activity myapp.com/.MyActivity

После того, как я поймаю исключение "SQLiteException: невозможно открыть файл базы данных", должно ли приложение просто попытаться создать экземпляр другого SQLiteOpenHelper?

  • 0
    «невозможно открыть файл базы данных» не обязательно означает, что базы данных больше нет. Это может быть просто повреждено каким-то образом. e.printStackTrace() исключение и используйте e.printStackTrace() чтобы увидеть остальную часть исключения. Это действительно говорит тебе, что не может его найти?
  • 0
    Я забыл упомянуть, что использовал команду find /data -name *.db а база данных приложения не отображалась.
Показать ещё 5 комментариев
Теги:

1 ответ

1
Лучший ответ

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

Решение:

объект SQLiteOpenHelper (вложенный класс в одном классе Singleite класса SQLiteStorage) должен быть создан из Application.onCreate(), чтобы таблицы были готовы к тому времени, когда активность службы и запуска была вызвана их функцией onCreate()

Объяснение:

То, что произошло, - это запуск программы запуска с помощью намерения (которое также использовало SQLite DB для хранения), а активация запуска также инициировала SQLiteOpenHelper.onCreate(). Однако, поскольку там было много таблиц, которые необходимо было создать, существовало условие гонки, и иногда база данных не была готова к тому времени, когда служба захотела этого.

  • 0
    У меня та же проблема, но мой код не многопоточный. пока не найдено решение

Ещё вопросы

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