Android-database gesperrt

Ich bekomme folgenden Fehler. Wie kann ich meine database entsperren?

10-28 08:43:26.510: ERROR/AndroidRuntime(881): FATAL EXCEPTION: Thread-11 10-28 08:43:26.510: ERROR/AndroidRuntime(881): android.database.sqlite.SQLiteDatabaseLockedException: database is locked 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:742) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.dbAdapter.DbAdapter.open(DbAdapter.java:25) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.services.NotificationManagerThread.run(NotificationManagerThread.java:49) 

Ich denke, Sie haben vergessen, die database zu schließen, oder ein anderer Thread schreibt in die database, wenn Sie versuchen, darauf zu schreiben. SQLite sperrt die database beim Schreiben, um eine Beschädigung zu vermeiden, wenn eine andere Entität gleichzeitig versucht, in dieselbe database zu schreiben. Android, zeigt nur einen Fehler in log cat, und die von Ihnen angegebene Anfrage wird einfach vergessen …

Also, ich empfehle:

  • Sie greifen nur von einem SQLOpenHelper auf die database zu
  • Sie stellen sicher, dass Sie alle Instanzen von databasehelfern schließen, sobald Sie damit fertig sind
  • Sie stellen sicher, dass Sie Transaktionen mit endTransaction() auch dann endTransaction() wenn Sie sie nicht erfolgreich setzen (dh wenn Sie sie endTransaction() möchten), falls Sie Transaktionen verwenden
  • Du könntest versuchen, Ormlite zu benutzen , ich habe es nicht benutzt, aber ich habe gehört, dass andere hier davon schwärmen.

Verwenden Sie eine einzelne Verbindung in Ihrer gesamten App. Siehe hier:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

Der Grund dafür ist, dass Sie immer nur eine Verbindung zur database geöffnet haben können (um beim Ändern der database Race Conditions zu vermeiden). Ich vermute, dass Sie mehrere Male aus verschiedenen Threads mit Ihrer database verbunden sind? Der einfachste Weg, dies zu umgehen, besteht darin, einfach ein ContentProvider- Frontend für Ihre database zu erstellen. Dies wird in der Lage sein, Abfragen von mehreren Threads zu behandeln.

Weitere Informationen finden Sie in diesem Blogpost .

Ich hatte das gleiche Problem, versuche das zu benutzen

  db.beginTransactionNonExclusive(); try { //do some insertions or whatever you need db.setTransactionSuccessful(); } finally { db.endTransaction(); } 

Ich versuchte mit db.beginTransaction, aber es schloss die bd

Ich hatte einen ähnlichen Fehler. Mein Problem war, dass ich versehentlich den databaseen der beiden Hilfsklassen den gleichen Namen gegeben habe, so dass sie gleichzeitig auf dieselbe database zugegriffen haben. Stellen Sie also sicher, dass Sie nicht auf eine einzelne database mit mehreren Hilfsklassen zugreifen.

Ich hatte das gleiche Problem, als ich versuchte, über einen ContentResolver auf meine database ContentResolver während ich bereits eine direkte SQLiteDatabase Verbindung dazu geöffnet hatte (erforderlich für Transaktionen).

Ich habe es getriggers, indem ich die Reihenfolge meines Codes so ContentResolver habe, dass der ContentResolver fertig ist, bevor meine direkte SQLiteDatabase Verbindung geöffnet wird.

Ich habe auch etwas Code entfernt, damit ich meine direkte SQLiteDatabase nicht mehr schließen SQLiteDatabase .

Es lohnt sich, diese Antwort zu lesen , da sie viele andere hilfreiche Anleitungen bietet.