如何在android项目中只打开一次数据库

时间:2014-02-14 13:54:43

标签: android android-fragments android-activity android-sqlite

我只想打开我的数据库一次,但不知怎的,我还是想不通。

我的 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 个答案:

答案 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();