firebase - Flutter:Firebase 实时数据库 orderByChild 对查询结果没有影响

标签 firebase flutter firebase-realtime-database

我以这种方式将这样的数据插入到 Firebase 实时数据库中:

enter image description here

我像这样查询数据库:

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/

相关文章:

firebase - 如何在Firebase云Firestore中查询一个字段然后按另一字段排序?

javascript - JS 中 Firebase 集成的“数据库未定义”问题

python-3.x - 如何修复Python中的 "Query'对象没有属性 'to_dict"错误?

ios - 如何解析Firebase实时数据库

android - 当我尝试从列表中删除项目时, flutter ,索引超出范围

javascript - 按下 React-native 按钮会执行 3 次 Firebase 数据库更新中的 2 次

javascript - 显示之前/当前提交的 Firebase 数据

visual-studio-code - 如何在vscode中包围 flutter 小部件

ios - 'FIRStorageHandle' 的声明必须在需要之前从模块 'FirebaseStorage.FIRStorageTypedefs' 导入

java - Firebase 数据库中的 setValue() 方法不起作用。值没有添加到数据库中