Firebase-按顺序获取数据列表(最后一个数据在前)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Firebase-按顺序获取数据列表(最后一个数据在前)相关的知识,希望对你有一定的参考价值。

我正在使用聊天应用程序。我想从Firebase数据库中获取最后20条消息,并按顺序添加了该消息。例如,如果我发送了3个不同的消息“嗨”,“怎么了”,“再见”。我应该以相同的顺序得到“嗨”,“怎么了”,“再见”。

我正在使用的查询如下。

ref.child(Constants.messageListKey).child("-Laray524a9Na-C7zdij").queryLimited(toLast: Constants.messageLimitPerCall).observeSingleEvent(of: .value, with:  (snapshot) in 
       let currentUserChatList = snapshot.value as? NSDictionary
       if let chatList = currentUserChatList?.allKeys  
         // parsing the data here
       

我什至尝试使用.queryOrderedByKey().queryOrdered(byChild:),但结果仍然相同。

我得到的结果不正确。例如,我收到“最新消息”,“嗨”,“再见”。结果甚至不是升序也不是降序。这只是一个随机顺序。

我正在使用的方案是这样的:

-chatList
    -autogeneratedKey
         -msg = "Some Message"

我有什么想念的吗?如果有任何我想念的细节,请让我知道,以更好地理解我的问题。

答案

我建议向您的节点添加时间戳,以保证顺序。然后,您还需要添加一个负时间戳,以启用降序排序

messages
   msg_0
     msg: "What's up"
     timestamp: 20190927013000
     neg_timestamp: -20190927013000
   msg_1
     msg: "Hi"
     timestamp: 20190927020000
     neg_timestamp: -20190927020000

然后您可以查询,但时间戳记为升序,而neg_timesstamp为降序,将被保证顺序。

节点是随机顺序的,因为您将它们作为字典读取,它们是键:值对的无序集合。

let currentUserChatList = snapshot.value as? NSDictionary

如果您想按顺序订购,请执行此操作

let currentUserChatList = snapshot.children.allObjects as! [DataSnapshot]

这将保持其顺序,您可以按照问题中的for循环遍历它们。每个子节点也将是一个DataSnapshot,因此您可以使用[]

let child in currentUserChatList 
   let msg = child.childSnapshot(forPath: "msg").value as? String ?? "No Msg"

以上是关于Firebase-按顺序获取数据列表(最后一个数据在前)的主要内容,如果未能解决你的问题,请参考以下文章

Firebase ios:按ID获取用户列表

Firebase 查询未按正确顺序执行?

使用 firebase 按最新消息对聊天列表进行排序

需要帮助将firebase中的数据转换为string []数组。尝试了所有可用的方法,但坚持只获取最后一个值

Firebase实时数据库GroupBy方法

按字母顺序获取对象的java集合