问题描述
在我的 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();