Abra / cierre correctamente una base de datos con el patrón de diseño Singleton

Estoy creando una aplicación que hace muchas interacciones con una base de datos (ambas operaciones de lectura y escritura).

Para evitar operaciones de apertura / cierre en cada solicitud, creé una clase que amplía SQLiteOpenHelper con un patrón de diseño Singleton. De esta manera, estoy seguro de que sólo una instancia de la SQLiteOpenHelper y sólo una conexión a la base de datos se realiza durante todo el ciclo de vida de la aplicación (y no sólo el ciclo de vida de la actividad ).

También leí algunos artículos sobre ContentProvider, pero no estoy seguro de que sea una manera mejor.

Por lo tanto, esta es la lógica principal de mi clase Singleton ( onCreate y onUpgrade eliminado):

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

Por lo tanto, para acceder a mi base de datos, hice esto:

 BaseSQLite baseSQLite = BaseSQLite.getInstance(context); baseSQLite.getAllData(); 

Funciona perfectamente por ahora. Pero mi pregunta es acerca del método close() . Realmente no sé cuándo llamarla. En realidad, mi instancia de base de datos es la misma para cada Activies de mi aplicación, así que creo que es una mala idea llamar a close() en un método onPause (), porque la instancia será potencialmente (y sucederá a menudo) recreada en el onStart() de la siguiente Actividad. Además, no puedo detectar el end de mi aplicación, es decir, cuando ya no hay actividad visible en la pantalla.

¿Puede alguien darme alguna ayuda sobre este problema? He encontrado alguna respuesta cuando la base de datos está vinculada a una actividad, pero no se da realmente una pista para mi caso.

Usted debe llamar cerca en cualquier momento que haya terminado de escribir en su base de datos. Por ejemplo, cuando inserta datos, tendrá una conexión abierta a la base de datos que se debe cerrar cuando se hace.

La lectura es diferente. Cuando crea una base de datos SQLite en su teléfono, los datos son persistentes. La base de datos existe y el manejador que crea proporciona una forma conveniente de acceder a esa información. La lectura de la base de datos suele tener lugar mediante la obtención de una instancia legible de la base de datos y utilizando un Cursor para extraer los valores. En ese caso, usted cierra el cursor cuando haya terminado, no la base de datos en sí.

Tiene razón en que no debe cerrar la conexión de base de datos durante los métodos de ciclo de vida de las actividades independientes. En su lugar, como se sugirió anteriormente, cierre la conexión de base de datos en los métodos de su controlador que escriben en la base de datos cuando haya terminado de realizar esa transacción.

  • Por qué necesitamos onUpgrade (); Método en la clase SQLiteOpenHelper
  • Excepción fatal: error desconocido (código 14) no se pudo abrir la base de datos
  • Problema con SQLiteOpenHelper en android 2.X y 3.X
  • Ejemplo de Android SQLite
  • Obtención de contexto en onCreate en SQLiteOpenHelper
  • ¿Cuándo debo llamar a close () en SQLiteOpenHelper utilizado por ContentProvider
  • Cursor finalizado sin cerrar antes () Android
  • SQLiteOpenHelper múltiples bases de datos en memoria
  • Android SQLiteException: Error al cambiar la configuración regional de db a 'en_US'
  • Archivo DB en carpeta de activos. ¿Se actualizará?
  • ¿Es realmente necesario crear tablas SQLite cada vez que se inicia la aplicación?
  • Interesting Posts
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.