如何使用 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 中按值(而不是按索引)读取/更新/删除?的主要内容,如果未能解决你的问题,请参考以下文章