Android SQLITE数据库错误,日志无效

Android SQLITE数据库错误,日志无效,android,android-sqlite,illegalstateexception,Android,Android Sqlite,Illegalstateexception,我发布了我的应用程序的更新,从用户那里收到了大量错误,我无法重新创建它或指出问题所在 我有两个错误: java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase java.lang.IllegalStateException:数据库未打开 两者都发生在同一时间 at com.jakar.package.dj.a(Unknown Source) at com.jakar.package.fi.a(Unknown Source) at co

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

我有两个错误:
java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase

java.lang.IllegalStateException:数据库未打开

两者都发生在同一时间

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:尝试重新打开已关闭的对象:SQLiteDatabase
是在您实际上没有正确关闭数据库时出现的,这并不一定意味着您在当前活动中关闭了数据库,这可能源于试图访问数据库的任何其他活动

此外,在打开数据库时,还必须在其他
活动生命周期
事件上关闭数据库,例如:

@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();
}

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

。此外,我很高兴向任何帮助我发现/修复问题的人颁发奖金。不幸的是,我两天内都无法将其用于悬赏。我有时也会面临同样的问题,因此我认为在调用
db.close()
)后调用任何db操作时,都会出现此类错误。在哪里调用此close?@RajeshCP,请参阅我添加的示例方法。我以这种方式处理对数据库的每个调用。您在哪里执行三个db.execSql查询?在onCreate中还是在升级中?你能把它的代码写出来吗?