Трепетание улья, как получить значения в обратном порядке ключей

#flutter #dart

#флаттер #дротик

Вопрос:

Я использую библиотеку под названием Hive, которая представляет собой очень быструю базу данных NoSQL. У меня все настроено, и я пытаюсь получить значения в обратном порядке (последнее в первом).

У меня есть поле записей, каждая запись имеет дату создания и текст записи. Как вы можете видеть в коде, что всякий раз, когда создается запись, ее дата — «Сейчас». Я хочу получить список записей, начиная с самой последней записи (последняя дата). по умолчанию первая запись, добавленная с помощью box.add() , будет иметь ключ 0, следующий за ним равен 1 и т. Д. В документации Hive говорится, что извлечение значений может быть выполнено «в обратном лексикографическом порядке», но я не смог это понять.

Заранее спасибо!

 import 'package:hive/hive.dart';
part '../type_adapters/entry.g.dart';

@HiveType(typeId: 0)
class Entry extends HiveObject {
  @HiveField(0)
  String _entryText;
  @HiveField(1)
  DateTime _creationDate;
  Entry(this._entryText) {
    _creationDate = DateTime.now();
  }

  String get entryText => _entryText;
  DateTime get creationDate => _creationDate;

  @override
  String toString() {
    return "$_entryText, $_creationDate, $key";
  }
}

 

ссылка на библиотеку:
Документация по улью Hive

Ответ №1:

Итак, я понял, что вы должны передать свою собственную функцию сортировки при открытии коробки. по умолчанию Hive выполняет следующие действия:

 /// Efficient default implementation to compare keys
int defaultKeyComparator(dynamic k1, dynamic k2) {
  if (k1 is int) {
    if (k2 is int) {
      if (k1 > k2) {
        return 1;
      } else if (k1 < k2) {
        return -1;
      } else {
        return 0;
      }
    } else {
      return -1;
    }
  } else if (k2 is String) {
    return (k1 as String).compareTo(k2);
  } else {
    return 1;
  }
}
 

их функция по умолчанию возвращает вам значения в лексикографическом порядке. чтобы отменить его, мне пришлось передать мой собственный «keyComparator» (который является функцией, используемой для сортировки значений, он получает 2 ключа и возвращает значение int)

поэтому при открытии окна:

 _entryBox = await Hive.openBox(ENTRY_BOX, keyComparator: _reverseOrder);
 

Функция _reverseOrder функция _reverseOrder:

   int _reverseOrder(k1, k2) {
    if (k1 is int) {
      if (k2 is int) {
        if (k1 > k2) {
          return -1;
        } else if (k1 < k2) {
          return 1;
        } else {
          return 0;
        }
      } else {
        return -1;
      }
    }
  }
 

это становится немного сложнее, если вы хотите использовать клавиши start и end вместо того, чтобы получать все значения сразу ( box.valuesBetween(startKey: , endKey:, ).

Ответ №2:

Я знаю, что уже довольно поздно добавлять ответ на эту угрозу. Но я добавляю это, если кто-то еще застрял на этом.

Hive не поддерживает сортировку. Итак, самый простой способ — отсортировать список после получения значений из поля.

 entryList = entryBox.values;
 

Теперь отсортируйте список, прежде чем показывать его в пользовательском интерфейсе.

 entryList.sort((a, b) => -a._creationDate.compareTo(b._creationDate));
 

Знак (-) меняет список с самой последней временной метки на более старую.