Porównaj ceny domen i usług IT, sprzedawców z całego świata

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)

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po zaktualizowaniu oprogramowania Android mam ten sam błąd. baza danych została utworzona przez stare oprogramowanie sprzętowe i dlatego nie mogła zostać otwarta przez nowe oprogramowanie.
użytkownicy mogą rozwiązać ten błąd, odinstalowując i ponownie instalując aplikację.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jednym z możliwych scenariuszy, w którym może się to zdarzyć, jest uzyskiwanie dostępu do pliku bazy danych z wielu wątków i blokowanie pliku przez jeden z wątków podczas próby otwarcia go w celu wprowadzenia zmian z innego wątku.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

może tak być, jeśli aplikacja otwiera bazę danych z wielu wątków w tym samym czasie, co może powodować ten wyjątek.
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
private synchronized SQLiteDatabase getWritableDB() {
//get your database and return it from this method.
}

i wywołaj tę metodę, gdy otrzymasz bazę danych.
Mam nadzieję że to pomoże.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dla każdej aplikacji bazodanowej najpierw tworzę bazę danych sqlite za pomocą dodatku Sqlite Manager Firefox i przenoszę ją do folderu/res/raw. Następnie w moim kodzie sprawdzam, czy baza danych istnieje w/data/data dla tej aplikacji. Jeśli nie, kopiuję plik DB do tego katalogu wraz z moim kodem.
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
SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);

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

Anonimowy użytkownik

Potwierdzenie od:

@yuku
Miałem taki problem, rozwiązałem go w ten sposób.
  • Musimy sprawdzić, czy stary pasuje baza dane z nowa baza dane, jeśli coś się zmieniło w nowej bazie w tym czasie musimy usunąć stara baza dane i zainstaluj nowa baza data LUB zmień tabelę, aby była zgodna z nową bazą danych
  • Druga opcja jest po prostu prosta usunąć stary aplikację i zainstaluj nową

Mam nadzieję, że to działa dla Ciebie .. !!!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zmierzyłem się z tym problemem.
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

Anonimowy użytkownik

Potwierdzenie od:


Zainstaluj ponownie aplikację

i spróbuj użyć zsynchronizowanego bloku dla


operacje na bazach danych CURD :)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się