Losowy wyjątek android.database.sqlite.SQLiteException: nie można otworzyć pliku bazy danych
Moja aplikacja używa modułu obsługi nieprzechwyconego wyjątku, który wysyła mi stos śledzenia, gdy aplikacja ulegnie awarii. Często otrzymuję ten raport od przypadkowych użytkowników.
Nie mogę tego odtworzyć, otwarcie bazy danych w moim przypadku zawsze kończy się sukcesem. To nie jest baza danych przechowywana na zewnętrznej karcie SD, tylko baza danych otwarta za pomocą
SQLiteOpenHelper (context, "SomeName", null, someVersionCode).
Czy masz jakieś doświadczenie w tej branży? Jakie funkcje mogę sprawdzić przed otwarciem bazy danych?
Podziękować!
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)
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
7 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
użytkownicy mogą rozwiązać ten błąd, odinstalowując i ponownie instalując aplikację.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
wypróbuj metodę zsynchronizowaną, aby otworzyć bazę danych. metoda synchronizowana zapobiegnie otwarciu bazy danych z wielu wątków w tym samym czasie.
umieść poniższy kod w swoim dbHelper
i wywołaj tę metodę, gdy otrzymasz bazę danych.
Mam nadzieję że to pomoże.
Anonimowy użytkownik
Potwierdzenie od:
W Twojej sytuacji trudno jest wskazać dokładny powód bez sprawdzenia, w jaki sposób utworzyłeś bazę danych i jak z niej korzystasz. Problem z uzyskaniem tego wyjątku może mieć kilka przyczyn. Niektóre pytania zostały już wspomniane przez innych. Chcę wspomnieć o jednej rzeczy. Czy możesz spróbować otworzyć bazę danych w ten sposób
Prawdopodobnie mógłbym spróbować pomóc lepiej, gdybyś pokazał swoje fragmenty kodu. Cóż, moje metody są tutaj udokumentowane, możesz zobaczyć, czy to pomaga.
Wypełnienie bazowe
https://coderoad.ru/19263028/
Dane SQLite
Anonimowy użytkownik
Potwierdzenie od:
Miałem taki problem, rozwiązałem go w ten sposób.
Mam nadzieję, że to działa dla Ciebie .. !!!
Anonimowy użytkownik
Potwierdzenie od:
Jedna z moich aplikacji zachowywała się dokładnie tak samo, ponieważ dodałem kod kopiujący bazę danych z zasobów do określonej lokalizacji na ekranie powitalnym (ekran, który jest widoczny podczas uruchamiania aplikacji i automatycznie wyłącza się po kilku sekundach).
A co się zdarzyło w niektórych przypadkach, ta baza danych nie została skopiowana w określonym czasie, a dostęp do niej z aplikacji rzucał wyjątki.
Co ja zrobiłem,
Właśnie napisałem kod, aby skopiować bazę danych w wątku w tle i pokazać użytkownikowi ekran powitalny, dopóki baza danych nie zostanie skopiowana, dopiero potem pokazuję następujący ekran.
Może istnieć inne rozwiązanie w przypadku, gdy aplikacja jest zainstalowana w poprzedniej wersji, napisz kod, aby skopiować zapisane dane z poprzedniej wersji aplikacji do nowej wersji, jeśli wymagana jest ochrona danych, a nowa wersja zawiera inne modele niż poprzednia wersja .
Anonimowy użytkownik
Potwierdzenie od:
Zainstaluj ponownie aplikację
i spróbuj użyć zsynchronizowanego bloku dla
operacje na bazach danych CURD :)