Как удалить все ящики в Hive Flutter?

Я разрабатываю приложение на Flutter; он будет хранить некоторые данные локально, поэтому я решил использовать пакет Hive, который был действительно потрясающим пакетом для хранения данных. Итак, теперь я буду хранить все данные локально, когда пользователь нажимает кнопку синхронизации. После этого, если пользователь снова нажимает кнопку «Синхронизировать», мне придется удалить все поля и сохранить данные, которые могут иметь или не иметь одинаковое имя поля.
Я не хочу увеличивать объем хранилища приложения, чтобы увеличить его, если синхронизация нажата кнопка, я хочу удалить все поля и снова создать поле.


person Praveen Kumar U    schedule 18.02.2020    source источник
comment
Вы нашли решение? Если да, то поделитесь, пожалуйста, ответом.   -  person K Pradeep Kumar Reddy    schedule 14.06.2021


Ответы (3)


Вы можете использовать метод deleteFromDisk. Он удаляет файл, содержащий коробку, и закрывает коробку.

_myCourseBox.deleteFromDisk();
person Vinoth Vino    schedule 01.06.2020

К сожалению, я не думаю, что была реализована функция 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').

person Vishnar Tadeleratha    schedule 14.03.2020

Вы не поделились никаким кодом, поэтому я просто приведу пример.

Я бы посоветовал вам открыть коробки в вашей основной функции

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();
person Selim Kundakçıoğlu    schedule 18.02.2020
comment
разве вам не нужно ждать перед этим? await box.clear(); - person Legit Stack; 30.06.2021