La fuente en negrita en la cita corresponde a esta parte de su código:
private DatabaseManager open() throws SQLException {
dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
de:http://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html
Enfoque n.º 1:usar una fábrica abstracta para crear instancias de SQLiteOpenHelper
Declare su asistente de base de datos como una variable de instancia estática y use el patrón Abstract Factory para garantizar la propiedad singleton. El código de muestra a continuación debería darle una buena idea sobre cómo diseñar correctamente la clase DatabaseHelper.
El método getInstance estático de fábrica garantiza que solo existirá un DatabaseHelper en un momento dado. Si el objeto mInstance no se ha inicializado, se creará uno. Si ya se ha creado uno, simplemente se devolverá.
No debe inicializar su objeto auxiliar usando new DatabaseHelper(context)
.
En su lugar, utilice siempre DatabaseHelper.getInstance(context)
, ya que garantiza que solo existirá un asistente de base de datos durante todo el ciclo de vida de la aplicación.
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);
}
}