Android - Datenbank Gesperrt ist

Ich habe eine Anwendung, ich kann das einfügen von Daten in eine SQLite-Datenbank. Gibt es ein service-thread läuft alle sechzig Sekunden, die überprüfung, ob eine Bedingung wahr ist, und dass ein alarm ertönt, wenn nötig. Denke, "Kalender" - Anwendung.

Habe ich viele Aktivitäten mit einem Verweis auf Ihre eigenen SQLiteOpenHelper, und Ihre eigenen SQLiteDatabase-Objekt.

Wurde die Anwendung funktioniert ziemlich gut, aber eine der wichtigsten Anwendungen aktualisiert entschied ich brauchte ein Dialogfeld mit dem Fortschritt unterworfen - das ist ein anderes Thema, aber wenn Sie können mir sagen, wie ich die spinner Spinnen, die groß sein würde. Es hat jedoch anzuzeigen.

Aber, um es anzeigen zu lassen, die ich brauchte, um es in einem thread.

Erstellen von diesem thread, ich begann, um Lasten von "Datenbank ist gesperrt" - Meldungen im Log.

Ich dachte, das Problem wurde möglicherweise mit der Tatsache zusammen, ich hatte eine Aufgabe, die im hintergrund laufen alle sechzig Sekunden - auch wenn es optisch dauerte nur ein paar Sekunden Zeit, um das update, so dass ich die wichtigsten schreiben, die Transaktionen für die updater-Funktion in einem beginTransaction-block. Das ist der einzige Ort, den ich verwendet eine.

Alles schien gut, aber dann begann ich immer mehr vermeidbare Fehler über die Datenbank gesperrt, alle über dem Platz.

Ist es ermutigte mich zu tun, etwas Aufräumen, aber es scheint, nachdem ich die ersten beginTransaction, jede weitere Datenbank-änderungen, die ich machen wollen, scheitern mit einem Bericht, dass die Datenbank gesperrt ist, trotz der Tatsache, dass ich Sie rufen db.schließen. Ich habe sogar schließen Sie die Datenbank-helper-Objekt und cursor, nur um auf der sicheren Seite.

War ich in der Lage zu bereinigen, die meisten Warnungen mit Bezug auf Cursor noch offen, z.B.

E/Database(  678): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

Ich konnte nicht herausfinden, was war das sperren der Datenbank, wie das alles war geschlossen.

Habe ich dann beschlossen, zu entfernen "beginTransaction" die stabilisierte Dinge - ich könnte jetzt navigieren Sie mein Programm wieder. Aber ich bin noch immer ein paar zufällige sperren Probleme.

E/Database( 1304): Failure 5 (database is locked) on 0x26e5d8 when executing 'INSERT INTO

Ist es möglich, herauszufinden, was das sperren der Datenbank? Ich kann sehen, was ist das Murren über die Sperre, aber nicht, was ist es gesperrt.

Was ist der beste Weg zu handhaben gleichzeitigen Datenbank-updates/liest sich wie das? Ich habe viel gelesen über synchronisierte und ContentProviders, aber ich muss zugeben, es ist ein bisschen groß für mich.

Alle Hinweise auf die "beste" Weg, Dinge zu tun?

Kann ich herausfinden, was das sperren der Datenbank?

Dank
Simon

  • Hmm, scheint niemand Sie zu beantworten. Ich habe die gleichen Fragen, ich würde gerne wissen, was das sperren und in der Lage sein, um herauszufinden, lock-Status, bevor ich Anfrage getWritabledatabase(), evtl. warten, bis freigeschaltet, dann stellen Sie das beschreibbare Anfrage.
InformationsquelleAutor Simon | 2011-01-16
Schreibe einen Kommentar