Когда мне следует называть close () на SQLiteOpenHelper, используемом ContentProvider

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

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

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

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

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

Solutions Collecting From Web of "Когда мне следует называть close () на SQLiteOpenHelper, используемом ContentProvider"

Разработчик Android-инфраструктуры отложил это представление, что вам нужно закрыть БД.

Согласно Dianne Hackborn (Android Framework Engineer) в этой теме :

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

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

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

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

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

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

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

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