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%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! :)
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.