2016-08-20 6 views
3

Я прочитал много дискуссий здесь, в StackOverflow, а также многих на веб-сайтах в Интернете о том, когда я должен открыть и закрыть свою базу данных sqlite. Я читал широкий диапазон ответов и догадок из разных периодов. Итак, в конце я больше смущен, чем раньше. Какие люди предложили:Android Открыть и закрыть базу данных

  1. Закрой дб в OnDestroy() Комментарии: "OnDestroy() не дозвонились всегда используйте OnStop()!" -> Так что onStart() должен открыть его.

  2. Db работает эффективно. Не нужно закрывать его.

  3. Откройте свой db один раз и создайте поле и аксессор.

  4. Закрыть после использования.

И многое другое ...

Так что правильно действовать в 2016 году? Pls не догадывается!

Examplelinks:

Android: opening and closing SQLite database

Android Closing database

+1

Моя мантра: '' откройте ее, используйте ее, закройте ее, откройте ее, используйте ее, закройте, откройте ее, используйте, закройте, откройте, используйте ее, закройте ... "' this применяется ко всем моим транзакциям и/или отдельным операциям CRUD. –

+1

Просто потому, что это 2016 год не означает, что использование Sqlite на Android изменило любой –

+0

@ cricket_007. После этой логики это было бы хорошо установлено. – XxGoliathusxX

ответ

6

Как с большим количеством вещей в компьютерном программировании, нет ни одного "Правильные продолжить" для времени закрытия базы данных 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 один раз и создайте поле и аксессор.

Это не имеет ничего общего с закрытием базы данных.

Закрыть после использования.

Это образец, и он выполнен правильно, он может работать.

+0

Во-первых, спасибо за подробный ответ! потому что я получаю доступ со всеми моими действиями к одной и той же базе данных, и я не использую многопоточность, версия onstart() с onDestroy() является наилучшей? – XxGoliathusxX

+1

@XxGoliathusxX: «И я не использую многопоточность» - вы ** действительно ** должны делать доступ к базе данных в фоновом потоке. Не делайте операций ввода-вывода с диска, сетевого ввода-вывода или другой медленной работы в главном потоке приложения, так как ваш пользовательский интерфейс заморожен, пока эта работа не будет завершена. – CommonsWare

+0

Я понятия не имею, как это сделать. Можете ли вы сослаться на хороший учебник? – XxGoliathusxX

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