Как читать / обновлять / удалять по значению (не по индексу) в Dart с помощью Hive?
Образец
deleteItem(int index) {
final box = Hive.box<Delivery>("deliveries");
box.deleteAt(index);
}
Я хотел бы изменить параметр индекса на идентификатор моего объекта), например,
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);
}
2 ответа
Как указано в другом ответе, это невозможно, если вы не выполните поиск каждого элемента и не сравните их идентификаторы один за другим . В зависимости от количества итенов в вашем ящике это может занять больше времени или вообще не иметь значения.
Один из примеров этого неоптимизированного способа:
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);
}
Этот код превращает класс Box в Map с помощью метода toMap() . Имея карту в руках, мы перебираем каждую запись на ней, проверяя, какая из них имеет конкретный идентификатор, и сохраняем его. После этого просто удаляем найденный ключ с помощью метода delete() . Вы можете узнать больше об итерациях через Карты здесь..
Имейте в виду, что это только пример. Если вы попытаетесь использовать это, вам, вероятно, нужно будет проверить, действительно ли существует элемент с идентификатором, который вы ищете. В этом случае вам также необходимо проверить наличие нескольких значений с одним и тем же идентификатором в вашем Box.
Думайте о базе данных «ключ-значение» как о обычном, старом добром словаре со словами и их определениями. Это позволяет вам очень быстро найти определение, используя заданное слово (допустим, вы ищете слово
elephant
). Однако, если вы хотите найти запись с определением, в котором говорится
An animal with big ears.
, это займет у вас гораздо больше времени.
Вот как работают базы данных "ключ-значение" с большим упрощением. Они работают быстро при запросе с использованием индекса.
Поэтому, если вы хотите запросить с использованием идентификатора, я бы рекомендовал использовать идентификатор в самом индексе.
Например:
Indexes:
delivery-001
delivery-002
...
Или, если вы также хотите выполнить некоторые другие более сложные запросы, я бы рекомендовал использовать обычную базу данных SQLite с использованием sqflite.