Intereting Posts
Android: отключить кнопку панели действий Зарегистрировать ContentObserver в приложении Application.OnCreate () VS Service Сделать Bluetooth на Android 2.1 доступным на неопределенный срок Как предотвратить автозаполнение Android Studio, удалив соседний токен Где ввести код для запуска приложения? Выпадающие меню HTML Select не работают в веб-обозревателе Android Сделать знак плюса в строке java Как создать панель инструментов (например, вторичную панель действий) в Android? Как показать вывод местоположения видимой части карты в андроиде? Приложение не настроено для выставления счетов через Google Play Дата и время прослушивателя изменений в Android? Как скомпилировать ядро ​​Android android goldfish 3.4 и запустить эмулятор Android: битмапы, загруженные из галереи, поворачиваются в ImageView Библиотека Java с использованием селекторов css для анализа XML RecyclerView пространство между элементами, расширяющимися при прокрутке

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