我正在做一些测试,每次我调用 SQLiteOpenHelper.close()然后我尝试重新打开数据库,例如 SQLiteOpenHelper.getWritableDatabase()我得到异常 java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase
有什么方法可以重新打开数据库吗?或者我应该重新创建 SQLiteOpenHelper 对象?
这是代码,它在第二次调用方法 getNoteCount 时崩溃
public DBController(Context ctx) {
this.mContext = ctx.getApplicationContext();
mDbHelper = new OpenHelper(mContext);
}
public int getNoteCount(){
SQLiteDatabase mDb =mDbHelper.getWritableDatabase();
Cursor c= mDb.query("notes", null, null, null, null, null, null);
int result=c.getCount();
c.close();
mDb.close();
return result;
}
private static class OpenHelper extends SQLiteOpenHelper {
DatabaseHelper(Context ctx) {
super(ctx, DB_NAME, null, DB_VERSION);
}
............
}
我正在考虑做这样的事情:
public abstract class DBHelper {
private SQLiteOpenHelper openHelper;
private int openCount = 0;
protected abstract SQLiteOpenHelper newSQLiteOpenHelper();
public void openDatabase() {
open();
}
public void closeDatabase() {
close();
}
protected synchronized SQLiteDatabase open() {
if (openHelper == null) {
openHelper = newSQLiteOpenHelper();
}
openCount++;
return openHelper.getWritableDatabase();
}
protected synchronized void close() {
openCount--;
if (openCount == 0) {
openHelper.close();
openHelper = null;
}
}
}
然后这样使用
public class DBController extends DBHelper{
public DBController(Context ctx) {
this.mContext = ctx.getApplicationContext();
}
@Override
protected SQLiteOpenHelper newSQLiteOpenHelper() {
return new OpenHelper(mContext);
}
public int getNoteCount(){
SQLiteDatabase mDb =open();
Cursor c= mDb.query("notes", null, null, null, null, null, null);
int result=c.getCount();
c.close();
close();
return result;
}
}
最佳答案
据我所知,在应用程序被销毁之前,您不应该关闭数据库。参见 Android error - close() was never explicitly called on database
关于java - SQLiteOpenHelper 和关闭方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16615431/