У меня также есть несколько действий, и каждое действие открывает свое собственное соединение с базой данных. Я поддерживаю основное действие в то время, когда начинаю другие действия, и вызываю метод finish () для дочерних действий, когда они мне больше не нужны.
Я вижу, что дочерняя активность может успешно открыть соединение и запросить данные, пока основная Actitity все еще удерживает свой DBAdapter. Когда дочернее действие заканчивается, основное действие запрашивает все открытые курсоры. Кажется, это происходит автоматически.
Однако после некоторого нажатия на пользовательский интерфейс, который приводит к тому, что мое приложение запускается и завершает действия, я в конечном итоге получу исключение:
ERROR/Database(17657): Leak found
ERROR/Database(17657): java.lang.IllegalStateException:
/data/data/yourpackage/databases/yourdatabase
SQLiteDatabase created and never closed
ERROR/Database(17657): at android.database.sqlite.SQLiteDatabase.<init>
(SQLiteDatabase.java:1694)
Исключением является не действие, которое в данный момент находится на переднем плане, а то, что было завершено некоторое время назад. Итак, происходит то, что сборщик мусора очищает и находит соединение с открытой базой данных. Это не влияет на приложение - оно продолжает работать нормально, и все запросы из переднего плана Activity возвращают данные.
Решение состоит в том, чтобы просто закрыть соединение в дочернем Activity. Событие onDestroy () является подходящим местом для этого:
@Override
protected void onDestroy() {
super.onDestroy();
myAdapter.close();
}
Поскольку я включил это во все свои дочерние действия, я больше не получаю исключение.