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

Posted

技术标签:

【中文标题】如何使用 Hive 在 Dart 中按值(而不是按索引)读取/更新/删除?【英文标题】:How to read/update/delete by value(not by index) in Dart using Hive? 【发布时间】:2021-05-31 23:33:42 【问题描述】:

样本

  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);


【问题讨论】:

但是我认为你的值可以被复制,你可以通过使用迭代器和 if 语句来做到这一点:value == "Hello" 然后从你的列表中删除值。 【参考方案1】:

正如另一个答案中所述,除非您搜索每个项目并逐个比较它们的 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 删除找到的密钥。您可以阅读更多关于遍历地图的信息here.。

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

【讨论】:

好的,如果这是唯一的选择,我会迭代每个框的值。谢谢 这适用于配置为地图的框,但那些配置为列表的框呢?在这种情况下你不能使用键,你会使用索引......但是如何?【参考方案2】:

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

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

所以如果你想使用 id 进行查询,我建议在索引本身中使用 id。

例如:

Indexes:

delivery-001
delivery-002
...

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

【讨论】:

以上是关于如何使用 Hive 在 Dart 中按值(而不是按索引)读取/更新/删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中按值计数对列进行排序

在 Scala 中按名称调用与按值调用,需要澄清

在 lambda 演算中按值调用

如何在 C# 中按值获取枚举对象?

如何在 JavaScript 中按值对地图进行排序?

在 C++11 中按值或引用使用 lambda 默认捕获的缺点?