13

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.

Antwort

0

Sie sollten sich immer melden, wenn Sie mit dem Schreiben in Ihre Datenbank fertig sind. Wenn Sie beispielsweise Daten einfügen, haben Sie eine offene Verbindung zur Datenbank, die geschlossen werden sollte, wenn Sie fertig sind.

Lesen ist anders. Wenn Sie eine SQLite-Datenbank auf Ihrem Telefon erstellen, sind die Daten persistent. Die Datenbank existiert und der von Ihnen erstellte Handler bietet eine bequeme Möglichkeit, auf diese Informationen zuzugreifen. Das Lesen der Datenbank erfolgt normalerweise durch Abrufen einer lesbaren Instanz der Datenbank und Verwenden einer Cursor zum Extrahieren von Werten. In diesem Fall schließen Sie den Cursor, wenn Sie fertig sind, nicht die Datenbank selbst.

Sie haben recht, dass Sie die Datenbankverbindung nicht während der Lebenszyklusmethoden der einzelnen Aktivitäten schließen sollten. Schließen Sie stattdessen, wie oben vorgeschlagen, die Datenbankverbindung in den Methoden Ihres Handlers, die nach Abschluss dieser Transaktion in die Datenbank schreiben.

+0

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

+0

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

+0

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