Android Открыть и закрыть базу данных

android database sqlite android-sqlite

4039 просмотра

1 ответ

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

  1. Закройте свою базу данных в onDestroy () Комментарии: «OnDestroy () вызывается не всегда! Используйте onStop ()!» -> Так что OnStart () должен открыть его.

  2. БД работает эффективно. Не надо его закрывать.

  3. Откройте свою базу данных один раз и создайте поле и метод доступа.

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

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

Так что же правильно продолжать в 2016 году? Просьба не угадать!

Examplelinks:

Android: открытие и закрытие базы данных SQLite

Android Закрытие базы данных

Автор: XxGoliathusxX Источник Размещён: 08.11.2019 11:31

Ответы (1)


9 плюса

Решение

Как и во многих вещах в компьютерном программировании, не существует единого «правильного продолжения» для определения времени закрытия базы данных SQLite (с помощью close()включения, SQLiteOpenHelperесли вы используете это, или close()включения SQLiteDatabaseиным образом).

Одно довольно жесткое правило - не использовать несколько SQLiteDatabaseобъектов для одной и той же базы данных в нескольких потоках одновременно. Это может привести к неприятностям, если вы не выполняете собственную синхронизацию потоков. Если вы придерживаетесь одного SQLiteDatabaseобъекта на базу данных, синхронизация потоков обрабатывается внутри SQLiteDatabase.

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

Лично я бы пошел по этому пути, используя подход open-use-close, особенно если вы используете SQLCipher для Android (зашифрованная замена SQLite). Однако в подходе open-use-close нет ничего особенно плохого, если вы уверены, что с базой данных будет одновременно работать только один поток.

Если только один компонент использует базу данных, нет ничего плохого в том, чтобы инициировать открытие onCreate()и закрытие базы данных onDestroy(). В конце концов, если это единственный компонент, который нуждается в базе данных, вам не нужна база данных, когда сам компонент исчезает.

Закройте свою базу данных в onDestroy () Комментарии: «OnDestroy () вызывается не всегда! Используйте onStop ()!» -> Так что OnStart () должен открыть его.

Если onDestroy()компонент не вызывается, либо вы потерпели крах с необработанным исключением в этом компоненте, либо ваш процесс был прерван. Последний сценарий не является проблемой (опять же, именно так ContentProviderработает, так как поставщик никогда не уничтожается). Первый сценарий не должен быть проблемой, если вы случайно не используете старое SQLiteDatabaseи более новое SQLiteDatabaseодновременно в нескольких потоках.

БД работает эффективно. Не надо его закрывать.

Это не вопрос эффективности. SQLite является транзакционным. Неспособность закрыть базу данных не является проблемой, так как нет незапущенных буферов или чего-то, о чем вам нужно беспокоиться.

Откройте свою базу данных один раз и создайте поле и метод доступа.

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

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

Это шаблон, и если все сделано правильно, он может работать.

Автор: CommonsWare Размещён: 20.08.2016 04:26
Вопросы из категории :
32x32