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

Posted

技术标签:

【中文标题】Firebase - 按顺序获取数据列表(最后一个数据)【英文标题】:Firebase - getting list of data in order (Last data first) 【发布时间】:2019-09-28 17:49:40 【问题描述】:

我正在开发一个聊天应用程序。我想从 Firebase 数据库中获取最后 20 条消息,并按顺序添加了消息。 例如,如果我发送了 3 条不同的消息“Hi”、“What's up”、“Bye”。我应该按相同的顺序得到“Hi”、“What's up”、“Bye”。

我正在使用的查询如下。

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:),但结果仍然相同。

我得到的结果不正常。例如,我收到“What's up”、“Hi”、“Bye”。结果既不是升序也不是降序。这只是一个随机顺序。

我使用的方案是这样的:

-chatList
    -autogeneratedKey
         -msg = "Some Message"

我有什么遗漏的吗? 如果我遗漏了任何细节,请告诉我以更好地理解我的问题。

【问题讨论】:

Firebase 数据库查询始终按升序返回结果。如果您需要它们以降序排列,您要么必须在客户端反转它们,要么将反转的值存储在数据库中。见***.com/q/45137899 【参考方案1】:

我建议为您的节点添加一个时间戳,以保证订单。然后,您还可以添加一个负时间戳,这将启用降序排序

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

然后你可以查询但 timestampt 为升序和 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"

【讨论】:

出于测试目的,我创建了一个新节点并添加了时间戳。并使用 .queryOrdered(byChild: "timestamp")。但这对我也不起作用。 @MrBrohi 两件事。 1)在您的问题中包含更新的代码,2)记住您是按 .value 查询的,因此所有节点都在快照中返回。向您的代码展示您如何访问快照中的子数据 非常感谢。这就是问题所在。没想到。

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

Firebase ios:按ID获取用户列表

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

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

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

使用完成处理程序按顺序执行操作

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