Я разрабатываю приложение на Flutter; он будет хранить некоторые данные локально, поэтому я решил использовать пакет Hive, который был действительно потрясающим пакетом для хранения данных. Итак, теперь я буду хранить все данные локально, когда пользователь нажимает кнопку синхронизации. После этого, если пользователь снова нажимает кнопку «Синхронизировать», мне придется удалить все поля и сохранить данные, которые могут иметь или не иметь одинаковое имя поля.
Я не хочу увеличивать объем хранилища приложения, чтобы увеличить его, если синхронизация нажата кнопка, я хочу удалить все поля и снова создать поле.
Как удалить все ящики в Hive Flutter?
Ответы (3)
Вы можете использовать метод deleteFromDisk. Он удаляет файл, содержащий коробку, и закрывает коробку.
_myCourseBox.deleteFromDisk();
К сожалению, я не думаю, что была реализована функция clear()
всех (открытых и неоткрытых) ящиков Hive. Файлы ящиков в основном помещаются в каталог документов приложения вашего устройства как файлы * .hive (сжатые файлы - как * .hivec, а файлы блокировки - как * .lock). Нет отдельного хранилища ключей и значений (или блока Hive), которое отслеживает ранее созданные блоки, хотя вы можете реализовать такое поле Hive самостоятельно и перебирать эти значения по своему усмотрению.
В вашем случае, когда вы просто хотите удалить все поля за один проход, обходной путь может заключаться в том, чтобы поместить все ящики Hive в подкаталог (с помощью Hive.initFlutter('chosenPath')
) и при необходимости просто удалить каталог, используя стандартные файловые операции. Единственная проблема заключается в том, что вы вызываете Hive.close()
, чтобы закрыть все открытые ящики, прежде чем пытаться это сделать (чтобы удалить не удаляемые файлы * .lock).
Чтобы упростить межплатформенные ссылки на каталог документов приложения, вы можете использовать пакет path_provider. Добавьте path_provider: ^1.6.5
к своим зависимостям в pubspec.yaml
и, если необходимо, в приложение dart import 'package:path_provider/path_provider.dart';
и import 'dart:io';
для файловых операций;
Допустим, вы используете Hive.initFlutter('chosenPath')
для инициализации и хранения своего Hive.
Поэтому всякий раз, когда вы хотите очистить все поля (после того, как убедитесь, что Hive.close()
был вызван), вы можете использовать следующий код:
// Get the application's document directory
var appDir = await getApplicationDocumentsDirectory();
// Get the chosen sub-directory for Hive files
var hiveDb = Directory('${appDir.path}/chosenPath');
// Delete the Hive directory and all its files
hiveDb.delete(recursive: true);
Каталог будет сгенерирован заново при следующем вызове Hive.initFlutter('chosenPath')
.
Вы не поделились никаким кодом, поэтому я просто приведу пример.
Я бы посоветовал вам открыть коробки в вашей основной функции
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
Hive.registerAdapter(yourAdapter());
await Hive.openBox('yourBoxName');
}
Когда пользователь хочет выполнить синхронизацию, вы можете сделать следующее:
// It will delete all the entry in the box
Hive.box('yourBoxName').clear();
yourSyncOperation();
await box.clear();
- person Legit Stack; 30.06.2021