SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Die SQLite-Verbindung ist durchgesickert, obwohl alles geschlossen ist

Die fettgedruckte Schriftart im Zitat entspricht diesem Teil in Ihrem Code:

private DatabaseManager open() throws SQLException {
    dbHelper = new DatabaseHelper(context);
    db = dbHelper.getWritableDatabase();

von:http://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html

Ansatz Nr. 1:Verwenden Sie eine abstrakte Fabrik, um den SQLiteOpenHelper zu instanziieren

Deklarieren Sie Ihren Datenbankhelfer als statische Instanzvariable und verwenden Sie das Abstract-Factory-Muster, um die Singleton-Eigenschaft zu gewährleisten. Der folgende Beispielcode sollte Ihnen eine gute Vorstellung davon vermitteln, wie Sie die DatabaseHelper-Klasse richtig entwerfen.

Die statische getInstance-Factory-Methode stellt sicher, dass zu einem bestimmten Zeitpunkt immer nur ein DatabaseHelper vorhanden ist. Wenn das mInstance-Objekt nicht initialisiert wurde, wird eines erstellt. Wenn bereits eine erstellt wurde, wird sie einfach zurückgegeben.

Sie sollten Ihr Hilfsobjekt nicht mit new DatabaseHelper(context) initialisieren .
Verwenden Sie stattdessen immer DatabaseHelper.getInstance(context) , da es garantiert, dass nur ein Datenbankhelfer über den gesamten Lebenszyklus der Anwendung hinweg vorhanden ist.

public static class DatabaseHelper extends SQLiteOpenHelper { 

  private static DatabaseHelper mInstance = null;

  private static final String DATABASE_NAME = "database_name";
  private static final String DATABASE_TABLE = "table_name";
  private static final int DATABASE_VERSION = 1;

  public static DatabaseHelper getInstance(Context ctx) {

    // Use the application context, which will ensure that you 
    // don't accidentally leak an Activity's context.
    // See this article for more information: http://bit.ly/6LRzfx
    if (mInstance == null) {
      mInstance = new DatabaseHelper(ctx.getApplicationContext());
    }
    return mInstance;
  }

  /**
   * Constructor should be private to prevent direct instantiation.
   * make call to static factory method "getInstance()" instead.
   */
  private DatabaseHelper(Context ctx) {
    super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
  }
}