Я выпустил обновление своего приложения, и я получаю массу ошибок от пользователей, и я не могу его воссоздать или указать проблему.SQLiteDatabase Ошибка, бесполезный Журнал
Две ошибки я получаю: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase
java.lang.IllegalStateException: database not open
ошибка происходит где-то в следующем коде:
public DBUserC getUser(int _id){
synchronized (DBAdapter.LOCK){
M.openDB(context);
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);
} else{
user = newUser();
}
cursor.close();
M.closeDB();
return user;
}
}
В этой версии есть обновление базы данных, в который я выполняю три запроса через db.execSql
. Это не в отдельном потоке.
При каждом вызове базы данных (за исключением onUpgrade
) я синхронизирую, затем открываю его, запускаю свой код и закрываю его. У меня не было проблем до этого обновления и я не могу найти проблему.
Любая помощь была бы принята с благодарностью.
EDIT: Чтобы открыть мои databas, я:
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;
}
}
AHost. onCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
M.initializeDB(context); //synchronized call to the openDB code I posted above
M.openDataDB(context); //opens a different database by a different file name. This DB is not an issue
//irrelevant ui setup
int _id = pref.getInt(P.eLastUser, VUser.ID_NEW);//row id of user
M.requeryUser();//synchronized, access database
M.switchUser(_id);//synchronized, access database
}
Это не понятно! вы имеете в виду, например, использование: '
' tag? –
Можете ли вы разместить содержание AHost onCreate()? – LairdPleng
Я разместил все соответствующие коды 'onCreate'. Я могу отправить M.requeryUser() и M.switchUser(), если это необходимо, но это будет довольно длинным – Jakar