问题描述
样品
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 数据库。