Не закрываете базу данных с помощью SQFlite Флаттера?

Я пытаюсь понять операции с базой данных с помощью плагина SQFlite для Flutter. В документах с рекомендациями по использованию автор говорит:

API во многом основан на Android ContentProvider, где типичная реализация SQLite подразумевает открытие базы данных один раз по первому запросу и ее сохранение.

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

Хранение ссылки только в виджете может вызвать проблемы с горячей перезагрузкой, если ссылка потеряна (а база данных еще не закрыта).

Означает ли это, что я создаю одноэлементный класс (как здесь), который открывает соединение с базой данных, а затем я никогда не закрываю его? То есть я никогда так не делаю

await database.close();

Я сталкивался с проблемами параллелизма в Android SQLite (как описано здесь), поэтому я обычно использовал провайдера контента, чтобы обойти это. Однако я просто использовал его, не понимая, что делает провайдер контента за кулисами. Поддерживает ли одно соединение с базой данных одно и то же? Нужно ли закрывать БД при выходе из приложения? Этот пользователь, кажется, думает, что это не имеет значения.

0 ответов

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

Вы можете инициализировать БД, переопределив onInitState() где вы можете вызвать функцию создания БД и закрыть, переопределив onDispose() куда вы можете позвонить db.close()

В качестве альтернативы, вы можете открывать / закрывать соединение для каждого запроса, но это добавит дополнительные накладные расходы на обработку, и в этом нет необходимости, особенно если вы делаете частые вызовы БД.

Для получения более подробной информации вы можете обратиться к этому сообщению: https://medium.com/@greg.perry/flutter-and-sqlite-f72878bc5859

Другие вопросы по тегам