Sto usando SQLiteOpenHelper per scrivere e leggere dal database SQlite su Android. Quando l'utente fa clic sull'interfaccia utente, leggo dal database SQLite utilizzando AsyncTask ma al momento esatto in cui sto aggiornando e scrivendo nel database in background usando altri AsyncTask.Accesso multithread Android SQlite
Ogni x volte ricevo un'eccezione bloccata nel database. Come posso risolvere questo? Si può accedere a SQlite in qualche modo da più thread contemporaneamente?
Lo sto usando in questo modo: ho una classe Database che si estende da SQLiteOpenHelper. Ho implementato i metodi OnCreate e ONUPGRADE e ogni volta che sto leggendo da database o scrivendo a base di dati che uso SQLiteDatabase così:
SQLiteDatabase database = null;
try {
database = new Database(context).getWritableDatabase();
....
writing and reading from database...
....
} catch (Exception e) {
e.printStackTrace();
} finally {
if (database != null) {
database.close();
}
}
Alla fine ho anche vicino SQLiteStatements e cursori se li uso. Dovrei usare @Justin answer e avere un singleton della classe database in Application?
Questo è l'errore che ottengo:
E/SqliteDatabaseCpp(17377): sqlite3_open_v2("/data/data/com.skulptur/databases/LGM.s3db", &handle, 6, NULL) failed
E/SQLiteDatabase(17377): Failed to open the database. closing it.
E/SQLiteDatabase(17377): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
E/SQLiteDatabase(17377): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750)
E/SQLiteDatabase(17377): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:223)
Penso che tutto ciò che si può fare con le librerie Android su sqllite sia sincronizzato. Non puoi provare a catturare l'eccezione e riprovare se ottieni lo stato di blocco? – quinestor
Puoi modificare il tuo post e fornire il primo paio di righe dell'eccezione e di eventuali dichiarazioni di causa? Ho il sospetto che questo sia meno di ciò che stai facendo e di più sul riutilizzo di un database chiuso o qualcosa del genere. – Gray