Когда мне следует вызывать close () для SQLiteOpenHelper, используемого ContentProvider - PullRequest
14 голосов
/ 16 декабря 2011

В моем приложении для Android я использую SQLiteOpenHelper для реализации ContentProvider. Все операции запроса, добавления, удаления выполняются через ContentProvider.

Но в одном из моих телефонов Android (htc g13) я обнаружил файл * .db-wal в каталоге / data / data / [имя пакета] / database. И размер файла очень быстро увеличивается при работе с ContentProvider. Это заняло слишком много пользовательского ОЗУ.

Рекомендуется закрыть SQLiteOpenHelper для решения моей проблемы (это полезно) в посте введите описание ссылки здесь .

Но я хочу найти «место» для добавления метода «close ()», так как я не использую SQLiteOpenHelper напрямую (используя ContentProvider). Метод query () в ContentProvider должен возвращать Cursor, а SQLiteDatabse должен оставаться в открытом состоянии.

Я в замешательстве, какое шоу я сейчас делаю, чтобы пропустить * .db-wal и нормально использовать ContentProvider?

Ответы [ 2 ]

6 голосов
/ 08 августа 2013

Инженер фреймворка Android полагает, что вам нужно закрыть БД.

Согласно Дайан Хэкборн (Android Framework Engineer) в этой теме :

Поставщик контента создается при создании его хостинга, и остается вокруг до тех пор, пока процесс, так что нет необходимости закройте базу данных - она ​​будет закрыта как часть ядра очистка ресурсов процесса после его завершения.

5 голосов
/ 16 декабря 2011

У вас есть пара случаев для рассмотрения:

1) Когда ваше приложение завершает работу (например, ввод onDestroy ()), убедитесь, что вы закрыли все курсоры, экземпляры базы данных SQLiteDatabase и SQLiteOpenHelpers (используя модель if (connection.isOpen ()) object.close ())

2) Когда приложение переходит в onPause () -> onResume () - используйте эти этапы соответствующим образом, чтобы приостановить / возобновить подключение или закрыть / открыть их.

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

Из официального документа: "После успешного открытия базы данныхкэшируется, поэтому вы можете вызывать этот метод каждый раз, когда вам нужно записать в базу данных. (Обязательно вызывайте close (), когда вам больше не нужна база данных.) "

Также имейте в видучто если SQLiteOpenHelper кэширует и отслеживает все открытые экземпляры SQLiteDatabase, это в основном означает, что если вы не оставите открытые соединения с базой данных, вам не придется вызывать close для SQLiteOpenHelper.

Я рекомендую закрыть все курсоры и базы данныхсразу после того, как вы перестанете с ними работать.Всегда старайтесь принудительно выполнять операции try / catch / for query и «блок finally» для вызова методов close для объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...