Подтвердить что ты не робот

Когда мне следует называть 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 обычно?

4b9b3361

Ответ 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 на объектах.