Когда мне следует называть 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 обычно?
Ответы
Ответ 1
Android-разработчик фреймворка отложил это представление, что вам нужно закрыть БД.
В соответствии с Dianne Hackborn (Android Framework Engineer) в этом потоке:
Поставщик контента создается, когда его хостинг-процесс создается, и остается вокруг до тех пор, пока процесс выполняется, поэтому нет необходимости закрыть базу данных - она будет закрыта как часть ядра очистка ресурсов процесса, когда процесс убит.
Ответ 2
У вас есть несколько случаев для покрытия:
1) Когда ваше приложение заканчивается (например, ввод в onDestroy()), вы должны закрыть все курсоры, экземпляры базы данных SQLiteDatabase и SQLiteOpenHelpers (используя модель if (connection.isOpen()) object.close())
2) Когда приложение запускается onPause() → onResume() - используйте эти этапы соответствующим образом, чтобы приостановить/возобновить соединение или закрыть/открыть их.
Хорошей практикой является закрытие базы данных сразу же после завершения работы с ней. База данных кэшируется, поэтому нет проблем с ее закрытием и повторным приобретением экземпляра снова, когда вам это нужно с помощью getWritableDatabase()/getReadableDatabase()
Из официального документа:
"После того, как вы успешно открылись, база данных кэшируется, поэтому вы можете вызывать этот метод каждый раз, когда вам нужно писать в базу данных (убедитесь, что вы вызываете close(), когда вам больше не нужна база данных.)"
Также имейте в виду, что если SQLiteOpenHelper кэширует и отслеживает все открытые экземпляры SQLiteDatabase, это в основном означает, что если вы не оставите открытые подключения к базе данных, вам не нужно будет закрывать SQLiteOpenHelper.
Я рекомендую закрыть все курсоры и базы данных сразу же после прекращения работы с ними. Всегда старайтесь применять операции try/catch/for queries и, наконец, блокировать вызов методов close на объектах.