Я выпустил обновление своего приложения и получаю массу ошибок от пользователей, и я не могу воссоздать его или определить проблему.
Я получаю две ошибки: 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;
}
}
db.close()
.. - person Chirag Ghori   schedule 18.01.2014