- Forum-Beiträge: 694
09.08.2012, 11:48:01 via Website
09.08.2012 11:48:01 via Website
In mehreren meiner Apps habe ich einen Backup/Restore der SQLite Datenbank auf die SD-Karte eingebaut. Das klappte jahrelang perfekt. Die Datenbankdatei des SQLite bestand immer aus einer einzelnen Datei - jedenfalls bis vor ein paar Tagen.
Zu dem Zeitpunkt erhielt ich den Hinweis eines Nutzers das ein Restore nicht alle Daten enthielt. Das klang seltsam da ich einfach die komplette Datei kopiere. Sollte dabei etwas schief gehen so ist die Datenbankdatei korrupt - sie ist aber nicht um einzelne Sätze erleichtert.
Mit Hilfe des Users habe ich dann nach und nach herausgefunden das SQLite ab 3.7.x einen neuen Logging Mechanismus erhält: WAL - Write Ahead Logging. Dieser Mechanismus ist in Android standardmäßig abgeschaltet. HTC hat dies in zwei Devices wohl angeschaltet. Über diesen Weg fand dieser Mechanismus dann seinen Weg in diverse Custom ROMs.
Ab diesem Zeitpunkt besteht die Datenbankdatei nicht mehr aus einer Datei sondern aus mehreren. Zudem ist dieses Logging vollständig anders als alle auf dem Markt befindlichen Logging Mechanismen. Üblicherweise werden im Transaction Log die Änderungen bis zum Commit vermerkt und dann in die Master-Datei übertragen. Alternativ wird während der Transaktion in die Master-Datei geschrieben und die Originaldaten werden in dem Log bis zum Commit gesichert. Was aber niemals passiert ist, das die Daten nach dem Commit nicht in der Master-Datei landen sondern im Log bleiben. WAL macht genau das. Die halten einfach bis zu 1000 Records/Transaktionen in der WAL und übertragen die Änderungen nicht sofort in die Master-Datei. Das bedeutet das die Daten auf mehrere Dateien verteilt sind bis ein Checkpoint nach 1000 Records/Transaktionen erfolgt.
Mein Problem nun: Ich kann dieses WAL nicht abschalten. Im Web kursieren Workarounds mit "PRAGMA journal_mode=DELETE;" die bei meinen Tests nicht funktionierten. Auch die mit API16 eingeführten Methoden der SQLiteDatabase zum Thema Logging greifen auf den HTC Geräten nicht. Meine Werkzeuge melden beim Öffnen einer solchen HTC Datenbankdatei "Database encrypted or File is not a database".
Ich schalte gerade in meinen Apps Backup/Restore komplett ab möchte aber nicht versäumen nach Ideen zu fragen. Wie geht Ihr mit Backup/Restore der Datenbank um? Wie würdet Ihr das lösen?
Danke.
— geändert am 09.08.2012, 11:49:38