我只想打开我的数据库一次,但不知怎的,我还是想不通。
我的 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(); ,但这不是正确的方法。有人能给我一个提示如何正确地做到这一点吗?
答案 0 :(得分: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();