我以这种方式将这样的数据插入到 Firebase 实时数据库中:
我像这样查询数据库:
final databaseReference = FirebaseDatabase.instance.reference();
databaseReference
.child('orders')
.orderByChild('date_slug')
.limitToFirst(pageSize)
.once()
.then((snapshot) {
firstPageItems = snapshot.value;
if (firstPageItems != null) {
List<dynamic> curretList = [];
firstPageItems.forEach((orderId, orderData) {
print ("date_slug " + orderData['date_slug'] + "\r\n\r\n\r\n");
curretList.add(orderData);
});
_list.addAll(curretList);
_listController.sink.add(_list);
}
});
但是,数据并没有像我预期的那样排序。请参阅下面的输出。
I/flutter (17125): date_slug 2020-04-20 15:52:13
I/flutter (17125):
I/flutter (17125):
I/flutter (17125): date_slug 2020-04-20 15:52:11
I/flutter (17125):
I/flutter (17125):
I/flutter (17125): date_slug 2020-04-20 15:52:10
I/flutter (17125):
I/flutter (17125):
I/flutter (17125): date_slug 2020-04-20 15:52:12
最佳答案
只要您调用firstPageItems = snapshot.value
,您正在将结果转换为 map /字典。字典可以保存结果的键和值,但它没有结果的相对顺序。
为了保持结果的顺序,您需要观察 onChildAdded
:
var query = databaseReference
.child('orders')
.orderByChild('date_slug')
.limitToFirst(pageSize);
query.onChildAdded
.forEach((event) => {
print(event.snapshot.value)
});
如果您需要知道何时处理了查询的所有子节点,可以向 value 事件添加一个额外的监听器:query.once().then((snapshot) {
print("Done loading all data for query");
});
添加这个额外的监听器不会导致下载额外的数据,因为 Firebase 会在幕后进行重复数据删除。或者,您可以通过
FirebaseList
class来自 FlutterFire 库,它使用相同的 onChildAdded
和另一个 onChild...
流来维护索引列表。使用此类的示例:
list = FirebaseList(query: query,
onChildAdded: (pos, snapshot) {},
onChildRemoved: (pos, snapshot) {},
onChildChanged: (pos, snapshot) {},
onChildMoved: (oldpos, newpos, snapshot) {},
onValue: (snapshot) {
for (var i=0; i < this.list.length; i++) {
print('$i: ${list[i].value}');
}
}
);
如您所见,这使用了 onValue
列表流以按顺序循环遍历子项。 onChild...
FirebaseList
需要方法类,但我们在这里没有对它们做任何有意义的事情。
关于firebase - Flutter:Firebase 实时数据库 orderByChild 对查询结果没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61333194/