SQLite IllegalStateException:我在哪里关闭数据库?

时间:2012-02-06 22:00:48

标签: android database sqlite exception illegalstateexception

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

SQLiteOpenHelper扩展类:

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

在我的activity类中,我实例化了这个类(在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()。

这真让我困惑,所以有人可以帮我解决错误吗?

2 个答案:

答案 0 :(得分:8)

您不应该关闭DatabaseHelper类中的数据库。但是,每次打开它时都需要关闭它,并调用getWritableDatabase

dbHelper = new DbOpenHelper(getApplicationContext());
database = dbHelper.getWritableDatabase();
//... do something with database
database.close();

答案 1 :(得分: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(); }

注意:所有打开/关闭都应在使用数据库的活动中完成,而不是打开帮助程序。