Когда я смотрю примеры из учебников, я вижу, что для getReadableDatabase
db не закрывается в конце, но для getWritableDatabase
он всегда закрыт в конце. Почему это? Даже в документах указано, что я должен позвонить close на getWritableDatabase
. Я прочитал оба документа, поэтому, пожалуйста, не просто цитируйте документы для меня. Благодарю.SQLiteDatabase закрыть или не закрыть после использования
ответ
По андроида документации sqlite database Writable базы данных «После открытия успешно, база данных в кэше, поэтому вы можете вызывать этот метод каждый раз, когда вам нужно записать в базу данных. (Обязательно позовите близко(), когда вы больше не нужна база данных.) Ошибки, такие как неправильные разрешения или полный диск, могут привести к сбою этого метода, но будущие попытки могут быть успешными, если проблема устранена ».
Поскольку записываемый файл кэшируется, как только он открывается, это означает, что он займет память. И если база данных большая, то огромная память, поэтому не закрывая ее или не открывая, может привести к утечкам элементов.
Надеется, что это помогает :)
Да, но я вижу проблему: удаление и обновление обычно переопределяются вызовом 'close' в конце , Но вставки и bulkInsert нет. Мое личное понимание заключается в том, что вставка не закрывается, потому что реализация по умолчанию bulkInsert по умолчанию просто вызывает вставку и поэтому вызывает закрытие после каждой итерации. Таким образом, доказательства показывают, что закрытие не * необходимо * ни для чего. Так это правильно? что 'close НЕ НЕОБХОДИМО? То есть Не происходит утечка памяти, если я не закрываю? –
близко необходим. Во время операций вставки он остается у разработчика, когда закрывается, когда он знает, есть ли у него больше, чтобы вставить или нет. –
@ Katedral Pillion см. Мое редактирование. –
Вы должны держать базу данных открытой до тех пор, как есть курсоры использование, которые содержат данные из него. Я сам редко закрываю базу данных, даже при использовании getWriteableDatabase()
.
Как я уже говорил, это потому, что утечка памяти не произойдет, если я буду держать базу данных открытой? –
Несмотря на то, что подразумевает документация, на самом деле нет существенной разницы между getReadableDatabase()
и getWritableDatabase()
; оба открывают базу данных, и эта база данных остается открытой до тех пор, пока она не станет close()
d. Так что эти примеры неверны; они должны обрабатывать оба случая одинаково.
Обратите внимание, что «когда вам больше не нужна база данных» не обязательно означает, что вам нужно закрыть его после каждого запроса; если, например, активность, скорее всего, будет обращаться к базе данных несколько раз, она совершенно корректна для ее открытия при запуске операции и закрытия ее при остановке активности.
Открытое соединение с базой данных резервирует некоторую память для своего кеша, и система останавливает действия, если требуется больше памяти, поэтому вы должны убедиться, что нет открытой базы данных, когда нет активной активности.
- 1. Закрыть или не закрыть?
- 2. Пул соединений: закрыть или не закрыть соединения?
- 3. Как закрыть Xvfb после использования
- 4. Закрыть программу после нажатия «Закрыть»
- 5. Зачем нужно закрыть файл после его использования?
- 6. Как закрыть окно после оповещения закрыть закрыть внутри php
- 7. Как закрыть меню после использования ToolStripTextBox
- 8. , чтобы закрыть соединение с базой данных после использования или нет?
- 9. Закрыть или не закрыть соединение в базе данных
- 10. Достаточно ли закрыть канал или закрыть RandomAccessFile
- 11. Чтобы закрыть или закрыть соединение Oracle?
- 12. Закрыть заголовок после вывода
- 13. Закрыть окно, после перенаправления
- 14. HTML: таблица строк таблицы/таблицы закрыть или не закрыть?
- 15. Закрыть меню после нажатия
- 16. скрыть или закрыть dijit.editor после редактирования сделано
- 17. Закрыть FancyBox после действия?
- 18. Закрыть окно после ответа.End()?
- 19. Закрыть прослушиватель после простоя
- 20. Закрыть OracleConnection после ExecuteReader
- 21. VBA - закрыть файл нецелевого использования
- 22. Не удается закрыть/закрыть Android-студию
- 23. JIRA: закрыть или решить?
- 24. закрыть или удалить
- 25. Не удается закрыть/закрыть соединение TLS
- 26. Как закрыть активность после таймаута
- 27. Закрыть файл после fs.readFile, обнуление
- 28. Force ProgressDialog закрыть после уничтожения
- 29. JQuery DatePicker Не скрывает после PopUp Закрыть
- 30. Закрыть WebResponse, или оставить открытым?
посмотреть, как реализовано 'close()': http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/database/sqlite/SQLiteClosable.java#105, кажется, что 'close()' имеет какой-либо эффект только в том случае, если #of 'purchaseReference()' == #of 'releaseReference()' – pskink