2012-04-09 2 views
0

У меня есть приложение с базой данных sqlite.База данных андроида sqlite уже закрыта Ошибка

Я создал свой собственный класс базы данных, содержащий экземпляр SqliteDatabase. Класс реализует мои запросы, открывает, закрывает и т. Д. (Класс НЕ является одиночным).

У меня есть активность, сервис и приложение в моем приложении.

Где мне нужна база данных, я создаю объект своего класса, открываю, делаю вещи и закрываю в конце.

Например, в действии я открываю db в onStart и закрываю его наStop.

Все работает отлично, за исключением приложения.

Если мне нужно выбрать данные в appwidget onUpdate, тогда все в порядке.

, но когда я пытаюсь сделать ОБНОВЛЕНИЕ из приложения, я получаю ошибку базы данных DATABASE_FLE уже закрытой.

Что это может быть?

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

Любые идеи?

Спасибо.

ответ

0

Проблема заключалась в том, что я скомпилировал объект SQLiteStatment и сохранил его для использования в будущем, в то время как мой объект базы данных был заменен. , поэтому SQLiteStatement необходимо снова скомпилировать.

У меня было что-то вроде этого:

public void func(SQLiteDatabase db) { 
    if (mStatement == null) 
     mStatement = db.compileStatement(SQL); 

    mStatement.execute(); 

Проблема с этим состоит в том, что объект БД изменен в вызове функции, и первый объект БД, который составляется заявление был уже закрыт.

Решение должно было удалить if-null и скомпилировать инструкцию для каждого объекта db.

+0

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

0

О чем я думаю, это случай, когда андроид может закрыть/выгрузить вашу активность (это может произойти, например, если на устройстве осталось немного памяти), но в это время ваш appwidget все еще активен.

Теперь из-за вашей активности закрыта, следовательно, вы закрыты. Appwidget пытается обновить БД, но он уже закрыт.

Проверьте этот сценарий, но в любом случае вы должны учитывать этот сценарий. :)

+0

в appwidget onUpdate, я создаю новый объект базы данных и открываю базу данных .. SELECT работает. Я получаю сообщение об ошибке при попытке обновления (фактически, когда я вызываю bind в объекте с sql-выражением) – Ran

Смежные вопросы