#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";
}
}
Ответ №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));
Знак (-) меняет список с самой последней временной метки на более старую.