SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Połączenie SQLite wyciekło, chociaż wszystko zamknięte

Pogrubiona czcionka w cytacie odpowiada tej części w kodzie:

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

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

Podejście nr 1:Użyj abstrakcyjnej fabryki do utworzenia instancji SQLiteOpenHelper

Zadeklaruj pomocnika bazy danych jako statyczną zmienną instancji i użyj wzorca Fabryki abstrakcyjnej, aby zagwarantować właściwość singleton. Poniższy przykładowy kod powinien dać dobry pomysł, jak prawidłowo zaprojektować klasę DatabaseHelper.

Statyczna metoda fabryczna getInstance zapewnia, że ​​w danym momencie będzie istniał tylko jeden DatabaseHelper. Jeśli obiekt mInstance nie został zainicjowany, zostanie utworzony. Jeśli taki został już utworzony, zostanie po prostu zwrócony.

Nie należy inicjować obiektu pomocniczego za pomocą new DatabaseHelper(context) .
Zamiast tego zawsze używajDatabaseHelper.getInstance(context) , ponieważ gwarantuje to, że w całym cyklu życia aplikacji będzie istniał tylko jeden pomocnik bazy danych.

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);
  }
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android - próba ponownego otwarcia już zamkniętego obiektu:SQLiteQuery za pomocą loaderManager

  2. Jak zapisać wartości rzeczywiste SQLite w wartościach Java BigDecimal?

  3. Android ListView przy użyciu SQLite

  4. Wstaw dane JSON do bazy danych SQLite w Androidzie

  5. Jak obliczyć różnicę między dwiema datami w SQLite