2015-09-05 3 views
1

Когда я смотрю примеры из учебников, я вижу, что для getReadableDatabase db не закрывается в конце, но для getWritableDatabase он всегда закрыт в конце. Почему это? Даже в документах указано, что я должен позвонить close на getWritableDatabase. Я прочитал оба документа, поэтому, пожалуйста, не просто цитируйте документы для меня. Благодарю.SQLiteDatabase закрыть или не закрыть после использования

+0

посмотреть, как реализовано '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

ответ

-1

По андроида документации sqlite database Writable базы данных «После открытия успешно, база данных в кэше, поэтому вы можете вызывать этот метод каждый раз, когда вам нужно записать в базу данных. (Обязательно позовите близко(), когда вы больше не нужна база данных.) Ошибки, такие как неправильные разрешения или полный диск, могут привести к сбою этого метода, но будущие попытки могут быть успешными, если проблема устранена ».

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

Надеется, что это помогает :)

+0

Да, но я вижу проблему: удаление и обновление обычно переопределяются вызовом 'close' в конце , Но вставки и bulkInsert нет. Мое личное понимание заключается в том, что вставка не закрывается, потому что реализация по умолчанию bulkInsert по умолчанию просто вызывает вставку и поэтому вызывает закрытие после каждой итерации. Таким образом, доказательства показывают, что закрытие не * необходимо * ни для чего. Так это правильно? что 'close НЕ НЕОБХОДИМО? То есть Не происходит утечка памяти, если я не закрываю? –

+0

близко необходим. Во время операций вставки он остается у разработчика, когда закрывается, когда он знает, есть ли у него больше, чтобы вставить или нет. –

+0

@ Katedral Pillion см. Мое редактирование. –

0

Вы должны держать базу данных открытой до тех пор, как есть курсоры использование, которые содержат данные из него. Я сам редко закрываю базу данных, даже при использовании getWriteableDatabase().

+0

Как я уже говорил, это потому, что утечка памяти не произойдет, если я буду держать базу данных открытой? –

1

Несмотря на то, что подразумевает документация, на самом деле нет существенной разницы между getReadableDatabase() и getWritableDatabase(); оба открывают базу данных, и эта база данных остается открытой до тех пор, пока она не станет close() d. Так что эти примеры неверны; они должны обрабатывать оба случая одинаково.

Обратите внимание, что «когда вам больше не нужна база данных» не обязательно означает, что вам нужно закрыть его после каждого запроса; если, например, активность, скорее всего, будет обращаться к базе данных несколько раз, она совершенно корректна для ее открытия при запуске операции и закрытия ее при остановке активности.

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

Смежные вопросы