Tučné písmo v citaci odpovídá této části vašeho kódu:
private DatabaseManager open() throws SQLException {
dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
z:https://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html
Přístup č. 1:Použijte abstraktní továrnu k vytvoření instance SQLiteOpenHelper
Deklarujte svého pomocníka databáze jako statickou proměnnou instance a použijte vzor Abstract Factory k zaručení vlastnosti singleton. Níže uvedený ukázkový kód by vám měl poskytnout dobrou představu o tom, jak správně navrhnout třídu DatabaseHelper.
Statická tovární metoda getInstance zajišťuje, že v daném okamžiku bude existovat pouze jedenDatabaseHelper. Pokud objekt mInstance nebyl inicializován, bude vytvořen. Pokud byl již vytvořen, bude jednoduše vrácen.
Svůj pomocný objekt byste neměli inicializovat pomocínew DatabaseHelper(context).
Namísto toho vždy použijteDatabaseHelper.getInstance(context), protože zaručuje, že během celého životního cyklu aplikace bude existovat pouze jeden databázový pomocník.
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);
}
}