Ich habe also eine Idee und frage mich, ob es realisierbar ist.
Nehmen wir an, ich habe mehrere Tabellen (Datenbankmodelle), von denen jede durch eine Klasse repräsentiert wird. Ich möchte kein Singleton-Muster mit dem open-Helfer verwenden, also habe ich eine einfache Klasse erstellt, um eine einzelne Instanz der Datenbank.Meine Idee ist, dass alle Tabellen mit Verweis auf SQLiteDatabase (die von der geöffneten Helper zurückgegeben wird) alle mit der gleichen DB-Instanz arbeiten und wahrscheinlich nicht benötigt werden, um die Arbeit mit der Datenbank seit der Open-Helfer zu synchronisieren Das. Wenn die letzte Tabelle ihre Arbeit beendet, wird der GC den offenen Helfer sammeln (da die letzte Referenz eine schwache Referenz sein wird) - & gt; finalize () wird aufgerufen und ich schließe die Datenbank während dieser Methode, um eine Warnung vom Betriebssystem zu verhindern. Meine Frage ist: Kann das funktionieren? Wird es automatisch die DB schließen und wird es auslaufen oder eine Ausnahme auslösen?
Hier ist meine Klasse:
%Vor%Ich kannte die Antwort auch nicht wirklich, interessierte mich aber und schaute nach.
Die Antwort ist hier richtig geschrieben; Ссылка
Aber im Grunde ist der Kern der Info;
Ich habe drei SQLiteOpenHelper-Klassen erstellt, eine für jede Tabelle, obwohl sie alle nur auf eine einzelne Datenbankdatei verwiesen haben.
Hier ist alles auseinander gefallen. Android verwaltet Versionen für Datenbanken basierend auf dem Paket, mit dem es verknüpft ist, dem Namen der Datenbank und der Versionsnummer, die Sie angeben. Das Paket und der Name bestimmen, was der Pfad auf dem Gerät sein soll, während die Version (irgendwo) auf dem Gerät gespeichert ist, so dass es weiß, wann es einen OpenHelpers onUpgrade Event-Handler aufrufen muss. Es stellt sich heraus, dass, wenn im SQLiteOpenHelper-Konstruktor festgestellt wird, dass die Datenbank bereits existiert, es Ihre onCreate- oder onUpgrade-Methoden überhaupt nicht aufrufen wird, selbst wenn die bestimmte Klasse, die den Aufruf ausführt, noch nie zuvor aufgerufen wurde.
Ich hatte das gleiche Problem, als ich an einem Projekt arbeitete. Ich bin auch verrückt geworden wegen der Zweifel, ob die statische Instanz genug Speicher verwendet hat und ein beträchtliches Speicherleck verursacht hat.
Ich bin mir nicht sicher, ob das Erstellen einer schwachen Referenz sicherstellen würde, dass die Datenbankinstanz erfasst wird. Eine mögliche Problemumgehung könnte jedoch lauten: Weisen Sie der statischen Datenbankinstanz einen Nullwert zu, sobald Ihre gesamte Datenbanktransaktion abgeschlossen ist und Sie die Datenbank geschlossen haben. Dadurch kann sichergestellt werden, dass die Datenbankinstanz keinen Speicher mehr zuweist.
Lassen Sie mich wissen, ob das funktioniert oder ob es einen besseren Work-around gibt.
Sie können es tun. Wie du sagst, sollte die Sperrung auf der SQLite geschehen und ich habe nie Probleme in der Umgebung gehört, also solltest du damit einverstanden sein. Die einzige Einschränkung, die Sie haben, ist, dass alle Tabellen in dieselbe Datenbank gehen müssen, da Android Ihnen jetzt nur eine Datei erlaubt.
Das Schließen der Datenbank ist eine andere Sache, deshalb ist es wirklich interessant, das Singleton-Muster zu verwenden (Sie vermeiden das Schließen + Öffnen der ganzen Zeit). Bei Ihrem Ansatz müssen Sie jedoch sicherstellen, dass Sie die Datenbank immer schließen, wenn Sie damit fertig sind. Soweit es mich betrifft, wird das nicht automatisch gemacht.
Außerdem hat Lars Vogel sehr nützliche und detaillierte Artikel über den DB-Zugang in Android geschrieben. Vielleicht möchten Sie sich dort umsehen. Ссылка
Meine Frage ist: Kann das funktionieren? Wird die DB automatisch geschlossen? und wird es auslaufen oder eine Ausnahme auslösen?
NEIN es wird nicht automatisch Datenbank geschlossen, wenn Ihre Anwendung für DATABASE-Objekt und Betriebssystem gefunden einige Ihrer Datenbank sofortige am Leben sind dann Android-Framework versuchen, diese Objektreferenz (die wahrscheinlich schwache Referenz ist) verbinden
und ich muss sagen, ich empfehle nicht, eine Datenbank auf Abruf oder vorübergehend zu öffnen und zu schließen. Es ist immer schön, die DB früh zu öffnen und sie für die Dauer Ihrer gesamten Aktivität offen zu halten und sie zu schließen, wenn die Aktivität beendet oder unterbrochen wird.
Tags und Links android synchronization weak-references sqliteopenhelper