Ошибка SQLiteDatabase, бесполезные журналы [дубликаты]

Я выпустил обновление своего приложения и получаю массу ошибок от пользователей, и я не могу воссоздать его или определить проблему.

Я получаю две ошибки: 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) я синхронизирую, затем открываю ее, запускаю свой код, а затем закрываю. У меня не было проблем до этого обновления, и я не могу найти проблему.

Любая помощь будет принята с благодарностью.

EDIT: Чтобы открыть мои базы данных, я делаю:

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;
        }
    }

person Reed    schedule 18.01.2014    source источник
comment
Кроме того, я рад наградить любого, кто поможет мне найти/исправить проблему. Я просто, к сожалению, не могу выставить его на баунти в течение 2 дней.   -  person Reed    schedule 18.01.2014
comment
Иногда я сталкиваюсь с той же проблемой, поэтому я думаю, что этот тип ошибки возникает, когда вы вызываете любую операцию БД после вызова db.close()..   -  person Chirag Ghori    schedule 18.01.2014
comment
где это близко вызывается?   -  person Triode    schedule 18.01.2014
comment
@RajeshCP, посмотрите мой пример метода, который я добавил. Таким образом я обрабатываю каждый вызов базы данных.   -  person Reed    schedule 18.01.2014
comment
где вы выполняете три запроса db.execSql? в onCreate или при обновлении? можно его код?   -  person Anirudha Agashe    schedule 18.01.2014


Ответы (2)


Я точно знаю, что 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();
}
person Rakeeb Rajbhandari    schedule 18.01.2014

Я не мог воссоздать проблему, потому что при тестировании я обновлял базу данных с версии 3 до версии 4. Многие из моих пользователей обновлялись с версии 2 до версии 4. Часть кода для обновления со 2 на 3 была основана на методах. В итоге я изменил некоторые из этих методов для версии 4, что сломало обновление версии 3. Затем я получил пойманное исключение из метода cursorToObject(), который у меня был, что привело к пропуску базы данных.close, а затем я получил исключение sqlite

person Reed    schedule 18.01.2014