SQLiteDatabase错误,无用的日志

时间:2014-01-18 05:47:47

标签: android android-sqlite illegalstateexception

我发布了我的应用程序的更新,我收到了很多用户的错误,我无法重新创建它或指出问题。

我得到的两个错误: 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;
        }
    }

2 个答案:

答案 0 :(得分:0)

我确实知道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();
}

答案 1 :(得分:0)

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