2

在 Android 中创建和填充我的新 SQLiteDatabase 时,我遇到了两个相互矛盾的异常。简而言之,我的代码:

SQLiteOpenHelper 扩展类:

public void onCreate(SQLiteDatabase db) {
    db.execSQL(DB_TABLE_CREATE);
    loadLevelData(db); //puts data in the database
    //db.close(); <<< ?
}

在我的活动类中,我实例化了这个类(在 onCreate() 中),并调用 getWritableDatabase():

dbHelper = new DbOpenHelper(getApplicationContext());
database = dbHelper.getWritableDatabase();  

db.close()现在,如果我在填充数据库后 不调用,就像上面一样,我得到

android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the   cursor or database object that was opened here  

但是,如果我关闭它,我会收到以下异常:

java.lang.IllegalStateException: database not open

在 getWritableDatabase() 上。

这真的让我感到困惑,所以任何人都可以帮助我解决问题吗?

4

2 回答 2

8

您不应该在DatabaseHelper课堂上关闭数据库。但是,每次打开它调用时都需要关闭它getWritableDatabase

dbHelper = new DbOpenHelper(getApplicationContext());
database = dbHelper.getWritableDatabase();
//... do something with database
database.close();
于 2012-02-06T22:15:52.383 回答
2

您在错误的时间关闭数据库。

我通常像这样保留数据库:

public class MyActivity extends Activity {
    SQLiteDatabase writeableDb;

    // ... 
    // Code
    // ...

    public void onStart(){
        super.onCreate(savedState);
        // Do stuff, get your helper, etc
        writeableDb = helper.getWriteableDatabase();
    }

    public void onStop(){
        writeableDb.close();
        super.onStop();
    }
}

或者,将使用该数据库连接的所有代码包装在 try/finally 块中

db = helper.getWriteableDatabase();
try { // ... do stuff ... }
finally { db.close(); }

注意:所有的打开/关闭都应该在使用数据库的 Activity 中完成,而不是在 open 助手中完成。

于 2012-02-06T22:58:11.200 回答