Как с большим количеством вещей в компьютерном программировании, нет ни одного "Правильные продолжить" для времени закрытия базы данных SQLite (через close()
на SQLiteOpenHelper
если вы используете это, или close()
на SQLiteDatabase
в противном случае).
Одно довольно жесткое правило состоит в том, чтобы не использовать несколько объектов SQLiteDatabase
для одной и той же базы данных в нескольких потоках одновременно. Это может вызвать у вас проблемы, если вы не выполняете собственную синхронизацию потоков. Если вы придерживаетесь одного объекта SQLiteDatabase
для каждой базы данных, синхронизация потоков обрабатывается внутри SQLiteDatabase
.
Из-за правила «одна база данных для всех» и потому, что во многих случаях отслеживание, когда потоки могут или не хотят, чтобы база данных была сложной, когда у вас много разных компонентов, некоторые разработчики используют подход один менеджер баз данных, который ленив - открывает базу данных ... и никогда не закрывает его. Например, база данных ContentProvider
использует этот шаблон, поскольку ContentProvider
никогда не уничтожается, поэтому нет четкого времени закрытия базы данных.
Лично я прохожу по этому маршруту по принципу открытого использования, особенно если вы используете SQLCipher для Android (зашифрованная замена SQLite). Тем не менее, нет ничего особенно плохого в использовании подхода open-use-close, если вы уверены, что с базой данных будет работать только один поток.
Если только один компонент использует базу данных, нет ничего плохого в запуске открытия базы данных в onCreate()
и закрытии ее в onDestroy()
. В конце концов, если это единственный компонент, который нуждается в базе данных, вам не нужна база данных, когда сам компонент уходит.
Закрыть ваш db in onDestroy() Комментарии: «OnDestroy() не вызывается всегда! Используйте onStop()!"-..> Так OnStart() должно открыть его
Если onDestroy()
не дозвонились на компоненте, либо вы упали с необработанным исключением в этом компоненте, или ваш процесс был прекращен Последний сценарий не проблема (опять-таки, так работает ContentProvider
, поскольку поставщик никогда не уничтожается). Первый сценарий не должен быть проблемой, если вы случайно не используете этот старый SQLiteDatabase
и некоторые новые SQLiteDatabase
в то же время через несколько потоков.
Db эффективно работает. Не нужно закрывать его.
Это не вопрос эффективности. SQLite является транзакционным. Неспособность закрыть базу данных не является проблемой, так как нет незакрепленных буферов или чего-то, о чем вам нужно беспокоиться.
Откройте свой db один раз и создайте поле и аксессор.
Это не имеет ничего общего с закрытием базы данных.
Закрыть после использования.
Это образец, и он выполнен правильно, он может работать.
Моя мантра: '' откройте ее, используйте ее, закройте ее, откройте ее, используйте ее, закройте, откройте ее, используйте, закройте, откройте, используйте ее, закройте ... "' this применяется ко всем моим транзакциям и/или отдельным операциям CRUD. –
Просто потому, что это 2016 год не означает, что использование Sqlite на Android изменило любой –
@ cricket_007. После этой логики это было бы хорошо установлено. – XxGoliathusxX