在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
这真让我困惑,所以有人可以帮我解决错误吗?
答案 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(); }
注意:所有打开/关闭都应在使用数据库的活动中完成,而不是打开帮助程序。