Chr*_*fer 2 flutter 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';
}
Run Code Online (Sandbox Code Playgroud)
玩家像这样添加到框中,其中player.id是唯一的键:
playerBox.put(player.id, player);
Run Code Online (Sandbox Code Playgroud)
启动应用程序时,我还打印playerBox的值:
print (playerBox.values);
Run Code Online (Sandbox Code Playgroud)
这给了我所有添加的球员。到目前为止,一切都很好。但是...删除一个播放器后是这样的:
playerBox.delete(playerId);
Run Code Online (Sandbox Code Playgroud)
它开始表现得有点奇怪。当我重新启动应用程序时,已删除的播放器不再位于playerBox.values中,因此显然已从那里删除。但所有已删除的玩家对象的构造函数仍在运行。
检查堆栈,我可以看到这些对象确实是由 PlayerAdapter 实例化的。因此,由于某种原因,Hive 仍会从磁盘读取已删除的对象,但它们不在框中。
** 编辑
我还检查了模拟器上的player.hive文件,所有删除的模型实际上都在该文件中。即使它们被删除并且不会与playerBox.values一起返回
有什么想法可能是什么原因吗?这是预期的行为吗?
我自己回答这个问题。
有什么想法可能是什么原因吗?这是预期的行为吗?
是的,是的。我想我应该更仔细地检查这些文档:压缩
Hive 是一个仅追加的数据存储。当您更改或删除某个值时,更改将写入 box 文件的末尾。迟早,box 文件会使用比应有的更多的磁盘空间。Hive 可能会随时自动“压缩”您的盒子以堵住文件中的“漏洞”。
所以我通过在删除后压缩框来解决这个问题,如下所示:
playerBox.compact();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1279 次 |
| 最近记录: |