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