Ich erstelle eine Anwendung, die viele Interaktionen mit einer Datenbank ausführt (Lese- und Schreibvorgänge).Öffnen/Schließen einer Datenbank mit dem Singleton-Entwurfsmuster
Um Öffnen/Schließen-Vorgänge bei jeder Anforderung zu vermeiden, erstellte ich eine Klasse, die SQLiteOpenHelper
mit einem Singleton-Entwurfsmuster erweitert. Auf diese Weise bin ich sicher, nur eine Instanz der SQLiteOpenHelper
und nur eine Verbindung zur Datenbank wird während der gesamten Anwendung Lebenszyklus (und nicht nur Aktivität Lebenszyklus) gemacht.
Ich habe auch einige Artikel über ContentProvider gelesen, aber ich bin mir nicht sicher, ob es ein besserer Weg ist.
Also, das ist die Hauptlogik meiner Singleton-Klasse (onCreate
und onUpgrade
entfernt):
public final class BaseSQLite extends SQLiteOpenHelper {
private static BaseSQLite mInstance = null;
private SQLiteDatabase db = null;
public static BaseSQLite getInstance(Context context) {
if (mInstance == null) {
mInstance = new BaseSQLite(context.getApplicationContext(),
DBNAME, DBVERSION);
}
return mInstance;
}
private BaseSQLite(final Context context, final String name,
final int version) {
super(context, name, null, version);
db = getWritableDatabase();
}
@Override
public synchronized void close() {
if (mInstance != null)
db.close();
}
public Cursor getAllData() {
String buildSQL = "SELECT * FROM myTable";
return db.rawQuery(buildSQL, null);
}
}
Also, meine Datenbank zugreifen zu können, ich diese gemacht:
BaseSQLite baseSQLite = BaseSQLite.getInstance(context);
baseSQLite.getAllData();
Es funktioniert jetzt perfekt. Aber meine Frage betrifft die close()
Methode. Ich weiß wirklich nicht, wann ich es nennen soll. Eigentlich ist meine Datenbankinstanz für alle Activities meiner Anwendung gleich, daher denke ich, dass es eine schlechte Idee ist, close()
in einer onPause() -Methode aufzurufen, weil die Instanz potentiell (und es wird oft passieren) in der onStart()
-Methode neu erstellt wird der nächsten Aktivität. Außerdem kann ich die end
meiner Anwendung nicht erkennen, d. H. Wenn keine Aktivität mehr auf dem Bildschirm sichtbar ist.
Kann mir jemand Hilfe zu diesem Problem geben? Ich habe eine Antwort gefunden, wenn die Datenbank mit ONE Aktivität verknüpft ist, aber es gibt keinen wirklichen Hinweis für meinen Fall.
Ok, also muss ich die Zeile 'db = getWritableDatabase()' entfernen und jede Methode 'getWritableDatabase()' oder 'getReadableDatabase()' hinzufügen. Dann, in der Schreibmethode, wie zum Beispiel 'updateEntry (Object)', sollte ich etwas machen wie: 'getWritableDatabase(); db.rawQuery (myRequestString, null); db.close() '? – mithrop
Wenn myRequestString eine Einfügungstatement ist - ja. [Schau dir dieses Beispiel an] (http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/) Ich schlage nicht vor, dass du genau kopierst, aber du kannst sehen, wie das Schließen innerhalb der Transaktion funktioniert. Die Art, wie ich es mache, ist eine Methode in der db-Handler-Klasse, die jede Schreibfunktion ausführt - z. Fügen Sie einen Eintrag zur Tabelle hinzu. Zu Beginn dieser Methode erhalte ich eine schreibbare Datenbankinstanz und wenn die Transaktion abgeschlossen ist, schließe ich sie am Ende der Methode. – Rarw
Ok. Es scheint eine wirklich gute Option zu sein.Ich machte mir Sorgen um die Auftritte, die viele Auf/Zu-Anrufe machten, aber anscheinend ist es nicht wirklich ein Problem :) – mithrop