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

Posted

技术标签:

【中文标题】订购数据实际上并不订购任何东西【英文标题】:Ordering data does not actually order anything 【发布时间】:2018-09-24 12:42:36 【问题描述】:

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

_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
   

数据应该是这样的。

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

亲切的问候, 纳马尼克斯

【问题讨论】:

好问题哈哈。忘记补充了。键等于“一” 这在此评论中毫无意义。但是,如果您查看屏幕截图,您会看到“一”是什么:) 不幸的是仍然是相同的输出 【参考方案1】:

很可能(如果没有看到 _messagesSubscriptionCallback 就很难确定)当您将 Firebase 中的数据转换为纯 JSON 对象时,您会丢弃订购信息,而后者(正如 Rene 所说)没有任何定义的顺序。

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

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

另见this example,例如what FirebaseAnimatedList does here。

【讨论】:

谢谢!我会检查的!我的 _messagesSubscriptionCallback 被发布为这个问题的答案。所以你可以在那里看到它。但你如何解释它是有道理的。我来看看例子【参考方案2】:

您显示的结果是一个 JSON 对象,其中包含其他对象。据我所知,JSON 对象从不排序,只能通过键检索。 JSON 数组会是,但它看起来不像你明白的。当您将其更改为数组时,文档 ID 必须位于文档内部,而不是对象键。我的猜测是,'orderBy' 旨在用于限制您获得的分页项目数量。比您可以按时间戳排序,将项目数限制为 20 并从您获得的最后一个时间戳开始搜索。

我想如果你想订购它们,我会将它们放在一个可以订购的新对象列表中。

【讨论】:

嗯好吧。这基本上就是我在自己的答案中所做的。我暂时保持这种状态。感谢您的反馈!【参考方案3】:

我现在通过在回调中执行此操作来临时修复它。但这感觉是一种非常糟糕的修复方法。我希望对此有一些想法。

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();

【讨论】:

以上是关于订购数据实际上并不订购任何东西的主要内容,如果未能解决你的问题,请参考以下文章

从不订购的客户

183. 从不订购的客户

从不订购的客户

183. 从不订购的客户

343从不订购的客户

在 Python 中订购 Logit?