0

Я хочу открыть базу данных только один раз, но каким-то образом я не могу ее понять.как открыть базу данных только один раз в проекте android

Мой MainApplication.java определяет, как открыть базу данных:

public static MySQLiteHelper openDatabase() { 
    if (dbHelper == null) { 
     dbHelper = new MySQLiteHelper(getInstance().getApplicationContext()); 
    } 
    database = dbHelper.getWritableDatabase(); 
    return dbHelper; 
} 

и в моем MainActivity.java я открыть базу данных:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MainApplication.openDatabase(); 
    // ... 

эта активность имеет некоторые фрагменты, которые имеют некоторые субфрагменты. При попытке доступа к базе данных с одним из тех фрагментов, которые я получаю следующее исключение:

02-14 14:17:46.945: E/AndroidRuntime(29537): FATAL EXCEPTION: main 
02-14 14:17:46.945: E/AndroidRuntime(29537): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/at.itn.android.belegscanner/databases/belegscanner.db 
02-14 14:17:46.945: E/AndroidRuntime(29537): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 
02-14 14:17:46.945: E/AndroidRuntime(29537): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1156) 
02-14 14:17:46.945: E/AndroidRuntime(29537): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) 
02-14 14:17:46.945: E/AndroidRuntime(29537): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200) 
02-14 14:17:46.945: E/AndroidRuntime(29537): at at.itn.android.belegscanner.db.dao.impl.DataSourceImpl.getAllElements(DataSourceImpl.java:45) 

исправление будет делать MainApplication.openDatabase(); каждый раз, когда я создаю фрагмент, но это не может быть правильным способом. Может ли кто-нибудь дать мне подсказку, как это сделать правильно?

ответ

1

Вы не должны использовать для этого деятельность. Для этого лучше использовать класс Application.

Что-то вроде этого:

public class MyDatabaseApplication extends Application { 

    private MySQLiteHelper dbHelper; 

    public MyDatabaseApplication() { openDatabase(); } 

    private void openDatabase() { 
     // open db here 
     dbHelper = ...; // 
    } 

    public Connection getConnection() 
    { 
     return dbHelper.getWritableDatabase(); 
    } 

} 

Затем в манифесте убедитесь, что вы определяете класс приложения:

<application android:name="MyDatabaseApplication" android:icon="@drawable/icon"  android:label="@string/app_name"> 

В других частях кода (например, действия) вы будете использовать:

Connection c = ((MyDatabaseApplication) this.getApplication()).getConnection(); 
+0

ОК Я не думал, что это было так просто. Спасибо, что проблема решена сейчас – Markus

Смежные вопросы