0

样本

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

}
4

2 回答 2

3

如另一个答案中所述,除非您搜索每个项目并逐个比较它们的 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() 方法将 Box 类转换为 Map 。手里拿着一张地图,我们遍历它上面的每一个条目,检查哪一个有特定的 ID 并记录下来。之后,我们只需使用delete() 方法删除找到的密钥。您可以在此处阅读有关迭代 Maps的更多信息.

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

于 2021-03-02T12:49:13.890 回答
1

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

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

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

例如:

Indexes:

delivery-001
delivery-002
...

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

于 2021-03-02T12:32:20.163 回答