微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Hive 在 Dart 中按值而不是按索引读取/更新/删除?

如何解决如何使用 Hive 在 Dart 中按值而不是按索引读取/更新/删除?

样品

  deleteItem(int index) {
    final Box = Hive.Box<Delivery>("deliveries");

    Box.deleteAt(index);
  }

我想将 index 参数更改为我的对象的 id),就像这样

  deleteItem(int id) {
    final Box = Hive.Box<Delivery>("deliveries");

    // Box.deleteAt(index);
    // Box delete by id here
  }

这里是我的 TypeAdapter 类:

@HiveType(typeId: 0)
class Delivery {
  @HiveField(0)
  final int id;

  Delivery(this.id);

}

解决方法

正如在另一个答案中所述,除非您搜索每个项目并一一比较它们的 ID,否则这是不可能的。根据您盒子中的物品数量,这可能需要更长的时间,也可能根本无关紧要。

这种未优化方式的一个例子是:

  deleteItem(int id) {
    final box = Hive.box<Delivery>("deliveries");

    final Map<dynamic,Delivery> deliveriesMap = box.toMap();
    dynamic desiredKey;
    deliveriesMap.forEach((key,value){
        if (value.id == id)
            desiredKey = key;
    });
    box.delete(desiredKey);
  }

这段代码的作用是使用 toMap() method 将 Box 类转换为 Map。手上有一张地图,我们遍历上面的每个条目,检查哪个具有特定的 ID 并记录下来。之后,我们只需使用 delete() method 删除找到的键。您可以阅读有关遍历 Maps here. 的更多信息。

请记住,这只是一个示例。如果您尝试使用它,您可能需要检查是否真的有一个带有您正在搜索的 ID 的项目。如果是这种情况,您还需要检查 Box 中具有相同 ID 的多个值。

,

将键值数据库视为包含单词及其定义的常规旧词汇表。它允许您非常快速地找到使用给定单词的定义(假设您正在寻找单词 elephant)。但是,如果您想查找定义为 An animal with big ears. 的条目,则需要更长的时间。

经过大量简化,这就是键值数据库的工作方式。 当您使用索引进行查询时,它们会很快。

因此,如果您想使用 id 进行查询,我建议您使用索引本身中的 id。

例如:

Indexes:

delivery-001
delivery-002
...

或者,如果您还想执行一些其他更复杂的查询,我建议使用使用 sqflite 的常规 SQLite 数据库。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。