我正在使用一个名为 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 Hive Documentation
最佳答案
所以我想通了,你必须在打开盒子时传递你自己的排序函数。 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函数:
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;
}
}
}
如果您想使用开始键和结束键而不是一次获取所有值( box.valuesBetween(startKey: , endKey:,
),事情会变得有点复杂。
关于flutter - Hive Flutter,如何以相反的键顺序获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65251802/