订购数据实际上并没有订购任何东西

时间:2018-04-14 07:49:42

标签: firebase firebase-realtime-database flutter

我正在尝试从firebase数据库中获取消息数据集,并希望按添加/时间戳排序消息。但由于某些原因,我实际上没有使用代码。我尝试过这两件事。

_messagesRef = FirebaseDatabase.instance.reference().child('messages/'+key);
_membersSubscription = _messagesRef
    .orderByChild('timestamp')
    .onValue//On valuechange
    .listen((Event event) => _messagesSubscriptionCallback(event)); 

 _messagesRef = FirebaseDatabase.instance.reference().child('messages/'+key);
 _membersSubscription = _messagesRef
    .orderByKey()
    .onValue//On valuechange
    .listen((Event event) => _messagesSubscriptionCallback(event)); 

两者都给了我相同的数据集,该数据集不是由回调中的时间戳或键排序的。我在

下添加了输出
{  
   -LA-Aw6crEAV53LxdujP:{  
      sender:1508,
      message:test s9 2,
      timestamp:1523642778089
   },
   -LA-Arby61T1UG5URMn6:{  
      sender:1508,
      message:test s9,
      timestamp:1523642759679
   },
   -LA-AyC7F8KAqceZBE3j:{  
      sender:1509,
      message:test emu 1,
      timestamp:1523642786632
   },
   -LA22WiUfL2tbh7-OjtM:{  
      sender:1508,
      message:Blaj,
      timestamp:1523690904480
   },
   -LA-B29RRXbdOPT1mG7m:{  
      sender:1508,
      message:tesy3,
      timestamp:1523642806940
   }
}

这是数据的方式。

enter image description here

我希望有人可以帮我解决这个问题。我想我可能会误解订购数据如何与Firebase一起使用

亲切的问候, Namanix

3 个答案:

答案 0 :(得分:1)

您显示的结果是一个JSON对象,其中包含其他对象。据我所知,JSON对象永远不会被排序,只能通过密钥检索。 JSON阵列会是,但它看起来不像你那样。当您将其更改为数组时,文档ID必须位于文档内,而不是对象键。我的猜测是'orderBy'用于举例来限制分页所获得的项目数量。您可以通过时间戳订购,将商品数量限制为20,并从您上次获得的时间戳进行搜索。

我想如果你想订购它们,我会把它们放在一个可以订购的新物品清单中。

答案 1 :(得分:1)

最有可能(在没有看到_messagesSubscriptionCallback的情况下很难确定)当您将数据从Firebase转换为普通的JSON对象时,您将丢弃订购信息(如Rene也说)没有任何明确的订单。

但是,您从Firebase请求的数据确实包含订购信息,您只需确保不要丢弃它。

执行此操作的常用方法是收听onChildAdded而不是onValue。随着Firebase将依次为每个孩子调用onChildAdded,它将按照您请求的顺序执行此操作。

另请参阅this example,例如what FirebaseAnimatedList does here

答案 2 :(得分:0)

我现在通过在回调中执行此操作暂时修复它。但这感觉是解决它的一种非常糟糕的方式。我希望对此有所了解。

static void _messagesSubscriptionCallback(Event event) {
    _messagesList.clear();
    _messages.clear();
    _messages = event.snapshot.value;
    _messagesList = _messages.keys.toList();
    _messagesList.sort((a, b) {
        return b.compareTo(a) ;
    });
    onMessagesChange();
}