Как читать / обновлять / удалять по значению (не по индексу) в 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.

Другие вопросы по тегам