java - SQLiteOpenHelper 和关闭方法

标签 java android sql sqlite

我正在做一些测试,每次我调用 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/

相关文章:

java - Google Go for Java 平台?

android - 根据显示尺寸检测加载了哪个布局?

sql - 如何在 SQL Server 2005 中的一条语句中更新两个表?

java - java Eclipse 中的工作区变量是什么?如何创建它们?

java - 使用 JSON 和 volley 发送数据

android - TextInputLayout - 如果 EditText 不为空且未获得焦点,则更改 float 标签提示颜色

android - 帮助防止后退按钮关闭子 Activity

sql - 就像内联查询中的情况一样,出现错误

mysql - 将字段从一个表复制到另一个字段匹配的表

java - 错误 - 代码在 NetBeans 中有效,但在 .jar 命令行中无效