【问题标题】:Objects deleted from Hive box are still loaded to memory从 Hive 框中删除的对象仍会加载到内存中
【发布时间】:2021-05-13 22:27:04
【问题描述】:

在我的 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 一起返回

任何想法可能是什么原因?这是预期的行为吗?

【问题讨论】:

    标签: flutter flutter-hive


    【解决方案1】:

    我自己回答这个问题。

    任何想法可能是什么原因?这是预期的行为吗?

    是的,是的。我想我应该更仔细地检查这些文档:Compaction

    Hive 是一个仅追加的数据存储。当您更改或删除一个值时, 更改将写入 box 文件的末尾。迟早, box 文件使用的磁盘空间超出了应有的范围。 Hive 可能会自动 随时“压缩”您的盒子以填补文件中的“漏洞”。

    所以我通过在删除后压缩框来解决这个问题:

    playerBox.compact();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2014-01-09
      • 1970-01-01
      • 2023-02-05
      相关资源
      最近更新 更多