SQLite数据库错误,无用的日志



我发布了我的应用程序的更新,并从用户那里收到了大量错误,但我无法重新创建它或查明问题所在。

我得到两个错误: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase


java.lang.IllegalStateException: database not open两者都发生在

at com.jakar.package.dj.a(Unknown Source)
at com.jakar.package.fi.a(Unknown Source)
at com.jakar.package.AHost.onCreate(Unknown Source)

映射到

at com.jakar.package.DBUserS.getUser(Unknown Source)
                                  saveUser
                                  getAllInfo
                                  cursorToInfo
at com.jakar.package.M.switchUser(Unknown Source)
                            requeryUser
                            createAlerts
                            addTab
                            hasScheduleData
                            getRandom
                            round
at com.jakar.workschedule.AHost.onCreate(Unknown Source)

在此版本中,有一个数据库升级,其中我通过db.execSql执行三个查询。它不在单独的线程中。

每次调用数据库时(onUpgrade 除外),我都会同步,然后打开它,运行我的代码,然后关闭它。在这次升级之前,我没有遇到任何问题,找不到问题。

任何帮助将不胜感激。

编辑:要打开我的数据库,我这样做:

if (helper==null)
    helper = new DBAdapter(context);
if (database==null){
     database = helper.getWritableDatabase();
} else if (!database.isOpen())
     database = helper.getWritableDatabase();

并关闭:

helper.close();
helper = null;
database = null;

获取信息的示例方法:

    public DBUserC getUser(int _id){
        synchronized (DBAdapter.LOCK){
            openDB(context);//this is the open code above
            Cursor cursor = M.database.query(DBUserHelper.TABLE_USERS,
                    VUser.allColumns, DBUserHelper.COLUMN_ID + " = '"+_id+"'", null, null, null, null);
            DBUserC user;
            if (cursor.moveToFirst()){
                user = cursorToInfo(cursor);//does not contain DB operations
            } else{
                user = newUser(); ////does not contain Database operations
            }
            cursor.close();
            closeDB();//This is the close code above
            return user;
        }
    }

我确实知道一个事实,即当您实际上没有正确关闭数据库时,就会出现java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase,这并不一定意味着您在当前活动中关闭数据库,这可能源于任何其他尝试访问数据库的活动。

此外,当您打开数据库时,还必须关闭其他activity lifecycle事件的数据库,例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    ...
    db.open();
    //some operation 
    db.close();
}
@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    if(db != null)
        db.close();
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    if(db != null)
        db.close();
}
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    db.open();
}

我无法重现问题,因为在测试中,我正在从数据库版本 3 升级到版本 4。我的许多用户正在从版本 2 升级到版本 4。从 2 升级到 3 的一些代码是基于方法的。我最终为版本 4 更改了其中一些方法,这破坏了版本 3 的升级。然后,我从 cursorToObject() 方法中捕获了一个异常,这导致跳过 database.close,然后我得到了 sqlite 异常

最新更新