2

我正在使用 Flutter 开发应用程序;它会在本地存储一些数据,所以我决定使用 Hive 包,它是一个非常棒的包来存储数据。所以现在我将在用户按下同步按钮时将所有数据存储在本地。之后,如果用户再次单击同步,我必须删除所有框并存储可能具有或可能不同框名称的数据。
如果单击同步按钮,我不想增加应用程序存储空间,我想删除所有框并再次创建框。

4

3 回答 3

12

您可以使用deleteFromDisk方法。它删除包含该框的文件并关闭该框。

_myCourseBox.deleteFromDisk();
于 2020-06-01T08:16:13.233 回答
4

不幸的是,我不认为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')

于 2020-03-14T08:38:08.183 回答
1

你没有分享任何代码,所以我只举一个例子。

我建议您在主要功能中打开这些框

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();
于 2020-02-18T14:09:53.050 回答