Android SQLite-Datenbank wird beschädigt

8

Dieser Link beschreibt mein Problem genau: Ссылка

Es gibt ungefähr 300 Leute, die gerade meine Android-App benutzen, und jedes Mal, wenn ich einen Absturzbericht an den Server mit dieser Stack-Ablaufverfolgung erhalte:

%Vor%

Das Ergebnis ist, dass die App abstürzt und alle Daten in der Datenbank verloren gehen.

Beachten Sie, dass ich jedes Mal, wenn ich in die Datenbank lese oder schreibe, eine neue SQLiteDatabase erhalte und sie schließe, sobald ich fertig bin. Ich habe das getan, um diese Art von Korruptionsfehlern zu verhindern.

Ich habe auch versucht, alle DB-Lese- und Schreibvorgänge mit einem einzelnen statischen Objekt zu synchronisieren, und das schien nicht zu helfen.

Ist es möglich, dass dies nur ein SQLite-Bug ist?

Ich habe einen ähnlichen Fehler mit der integrierten E-Mail-App gefunden: Ссылка .

Hier ist mein Code:

%Vor%     
Brandon O'Rourke 05.05.2010, 15:45
quelle

4 Antworten

9

Wahrscheinlich werden die Datenbankprozesse während einer I / O-Operation beendet. Zum Beispiel durch einen Task-Killer, oder wenn Sie zulassen, dass db-Schreiboperationen während einer Zeit fortgesetzt werden, wenn die App heruntergefahren oder in den Ruhezustand versetzt wird ...

Sehen Sie, ob Sie das Problem reproduzieren können, indem Sie Ihre App in eine DB-Write-Schleife setzen und einen Task Killer verwenden.

Szenario: 32 Byte werden in die Datenbank geschrieben, die Schreibaufgabe wird beendet, nachdem nur 10 geschrieben wurde, Ergebnis: Datenbank ist inkonsistent und möglicherweise korrupt.

Siehe auch: Android-Prozesskiller

EDIT: Öffnen und Schließen der DB für jedes Lesen / Schreiben? Hör auf damit! :)

    
Brad Hein 05.05.2010 18:13
quelle
2

Die Verwendung mehrerer Instanzen von SQLiteDatabase könnte Ihr Problem verursachen, wenn Sie zwei Instanzen gleichzeitig dieselbe Datenbankdatei aktualisieren.

    
Dave Webb 05.05.2010 16:48
quelle
1

Implementieren Sie jeden Tag einen Backup-DB-Prozess, und wenn die DB beschädigt wird, ersetzen Sie einfach die Datenbank durch eine Sicherung. Sie können einfache Methoden zum Einfügen von Dateien verwenden, um jeden Tag ein Backup zu erstellen.

    
Pentium10 13.05.2010 18:24
quelle
1

Da kann ich nichts von Brad's Post sagen.

Ich muss dem zusätzlichen Aufwand zustimmen.

Ich habe ein HTC Magic als mein tägliches Telefon, und RAM ist immer ein Problem.

Android-Handys sind an sehr unterschiedlichen Enden des $$$

Einige sind super billig und einige sind super teuer, das kommt im Grunde auf RAM und CPU.

Menschen, die Task Killer ausführen, ruinieren ihre Android-Handys.

Als Entwickler sollten Sie Leuten empfehlen, sie nicht zu benutzen, oder Leuten, die Task Killer benutzen, einfach die Unterstützung verweigern, da Android diese "Verbesserungen" nicht benötigt (fragen Sie Steve (Cyanogen))

Auch die new Anweisung in Android ist sehr teuer.

Sie möchten die Anzahl der Aufrufe von new beim Programmieren für Android begrenzen.

Bei der Programmierung für Android geht es um die Wiederverwendung des wertvollen Speichers. (HTC Magics / Dreams haben nur 96 MB für Anwendungen zur Verfügung, und das meiste davon ist bereits in Verwendung)

Wie für Ihre SQLiteDB ... sagt die API, dass Ihre SQLiteDB privat für Ihre Anwendung ist.

Ich verstehe nicht, warum Sie jedes Mal, wenn Sie lesen oder schreiben wollen, eine NEUE Verbindung zu ihm öffnen und schließen müssen.

Ich möchte die Verbindung lieber offen halten, bis der Benutzer den Fokus verliert.

Wenn Sie jedoch einen Inhaltsanbieter schreiben, ist das eine andere Geschichte.

    
Brian 17.05.2010 01:44
quelle

Tags und Links