Eccezione casuale android.database.sqlite.SQLiteException: imansible aprire il file di database

La mia app utilizza un gestore di eccezioni non rilevate che invia lo stack trace a me quando l’app si arresta in modo anomalo. Spesso ottengo questo rapporto da utenti casuali.

Non riesco a replicarlo, l’apertura del database ha sempre successo nel mio caso. Questo non è un database memorizzato su scheda SD esterna, solo un database aperto con SQLiteOpenHelper(context, "SomeName", null, someVersionCode) .

Hai qualche esperienza con questo? Quali sono le possibilità che posso verificare prima di aprire il database?

Grazie!

 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.(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) 

ho avuto lo stesso errore dopo aver aggiornato il mio firmware Android. il database è stato creato dal vecchio firmware e quindi non può essere aperto dal nuovo firmware. gli utenti potrebbero risolvere questo errore disinstallando e reinstallando la tua app.

Uno dei possibili scenari in cui ciò potrebbe accadere è quando accedi al tuo file di database da più thread e quando il file è bloccato da uno dei thread mentre stai tentando di aprirlo per le modifiche da un altro thread.

ci può essere se la tua app apre il database da più thread contemporaneamente che può essere la ragione di questa eccezione.

prova il metodo sincronizzato per aprire il metodo database.synchronized non permetterà al database di essere aperto da più thread contemporaneamente. metti sotto il codice nel tuo dbHelper

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

e chiama questo metodo quando stai ricevendo db. Spero che ti sarà d’aiuto.

@yuku

Questo tipo di problema che ho affrontato, ho risolto questo problema in questo modo.

  1. Abbiamo bisogno di verificare se il vecchio database è uguale al nuovo database , se qualcosa è cambiato nel nuovo database che tempo dobbiamo eliminare il vecchio database e installare il nuovo database OPPURE modificare la tabella come da nuovo database

  2. La seconda opzione è semplice, basta disinstallare la vecchia applicazione e installare una nuova applicazione

Spero che questo funzioni per te .. !!!

Per qualsiasi applicazione di database, creo innanzitutto il database sqlite con addon Sqlite Manager di Firefox e lo porto in / res / raw folder. Poi nel mio codice, controllo se il database esiste in / data / data per questa app. In caso contrario, copio il file db in quella directory con il mio codice.

Per la tua situazione, è difficile determinare il motivo esatto senza vedere come hai creato il tuo database e come lo stai usando. Ci possono essere diverse ragioni per il problema di ottenere questa eccezione. Alcuni problemi già menzionati da altri. Voglio menzionarne uno Puoi provare ad aprire il database in questo modo

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

Probabilmente, potrei provare meglio ad aiutarti se mostri i frammenti di codice. Bene, i miei metodi sono descritti qui, puoi dare un’occhiata se questo ti aiuta.

Compilazione del database SQLite

Ho affrontato questo problema.

Una delle mie applicazioni si comportava allo stesso modo, perché ho aggiunto il codice per copiare il database dalle risorse alla posizione specificata nella schermata iniziale (lo schermo che è visibile all’avvio dell’app e scompare automaticamente la vista dopo pochi secondi).

E quello che stava succedendo in alcuni casi, quel database non è stato copiato nel periodo di tempo specificato e accedervi dall’app causava eccezioni.

Cosa ho fatto,

Ho appena scritto il codice per copiare il database sul thread in background e mostrare all’utente la schermata iniziale fino a quando il database del tempo non viene copiato solo dopo che viene visualizzata la schermata successiva.

Potrebbe esserci un’altra soluzione nel caso, se l’app viene installata sulla versione precedente, scrivere il codice per copiare i dati salvati dalla versione precedente dell’app a nuova vesrion se la prevenzione dei dati è necessaria e la nuova versione contiene modelli diversi da quelli della versione precedente .

Reinstallare l’applicazione e provare a utilizzare il blocco sincronizzato per le operazioni CURD del database 🙂