A fonte em negrito na citação corresponde a esta parte do seu código:
private DatabaseManager open() throws SQLException {
dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
de:https://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html
Abordagem nº 1:use uma fábrica abstrata para instanciar o SQLiteOpenHelper
Declare seu auxiliar de banco de dados como uma variável de instância estática e use o padrão Abstract Factory para garantir a propriedade singleton. O código de exemplo abaixo deve lhe dar uma boa idéia de como projetar a classe DatabaseHelper corretamente.
O método getInstance de fábrica estática garante que apenas oneDatabaseHelper existirá em um determinado momento. Se o objeto mInstance não tiver sido inicializado, um será criado. Se um já tiver sido criado, ele será simplesmente retornado.
Você não deve inicializar seu objeto auxiliar usando comnew DatabaseHelper(context).
Em vez disso, sempre useDatabaseHelper.getInstance(context), pois garante que apenas um auxiliar de banco de dados existirá em todo o ciclo de vida do aplicativo.
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: https://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);
}
}