flutter - 从 Hive 框中删除的对象仍会加载到内存中
问题描述
在我的 Flutter 应用程序中,我有一个带有 Player 对象的 Hive 框。只是为了调试,我在构造函数中从我的播放器对象中输出一些数据,如下所示:
Player({
@required String name,
@required this.id,
}) {
this.name = name.toUpperCase();
print('${this.toString()}');
}
@override
String toString() {
return 'id: $id, name: $name';
}
玩家像这样添加到盒子中,其中 player.id 是唯一键:
playerBox.put(player.id, player);
启动应用程序时,我还会打印 playerBox 的值:
print (playerBox.values);
这给了我所有添加的玩家。到目前为止,一切都很好。但是......删除这样的玩家后:
playerBox.delete(playerId);
它开始表现得有点奇怪。当我重新启动应用程序时,已删除的播放器不再位于 playerBox.values 中,因此显然已从那里删除。但是所有已删除播放器对象的构造函数仍在运行。
检查堆栈我可以看到这些对象确实是由 PlayerAdapter 实例化的。因此,由于某种原因,Hive 仍然从磁盘读取已删除的对象,但它们不在框中。
** 编辑
我还检查了模拟器上的 player.hive 文件,所有删除的模型实际上都在文件中。即使它们已被删除并且不会与 playerBox.values 一起返回
任何想法可能是什么原因?这是预期的行为吗?
解决方案
我自己回答这个。
任何想法可能是什么原因?这是预期的行为吗?
是的,是的。我想我应该更仔细地检查这些文档:Compaction
Hive 是一个仅附加的数据存储。当您更改或删除一个值时,更改将写入 box 文件的末尾。迟早,box 文件使用的磁盘空间超出了应有的范围。Hive 可以随时自动“压缩”您的盒子以关闭文件中的“漏洞”。
所以我通过在删除后压缩盒子来解决这个问题:
playerBox.compact();
推荐阅读
- c++ - 两个大型数组之间的 C++ 标准化互相关
- bash - 管道 | 在bash用法中?
- fabricjs - fabricJS - 带有 toSVG 的 SVG 参数
- r - 使用整个数据的 tidyverse 中的逐行操作
- dialogflow-es - 如何在 Dialogflow 实现中获取当前意图的名称?
- excel - 如何将同一日期的多个销售的 GM% 计算为唯一日期?
- sql - 从 SQL Server 2012 中的 XML 列中提取属性
- javascript - 将列表数据从 html 传递到 python (flask)
- react-native - React Native flatlist 条件渲染
- r - R - CSV 到 ts 用于每日数据