我正在使用一个充当即时消息服务的Android应用程序,而我正在将消息数据提取到RecyclerView
。我让我的Firebase Query
对象返回与已加载的聊天的id
匹配的所有邮件,这样做是这样的:
Query qChatMessages = mDbRefMessages
.orderByChild("messageChat")
.equalTo(mChatId);
到目前为止一切都那么好,而这正在返回我期望的消息集合。现在的问题是,在将它们传递给要显示的RecyclerView
时,它们会按照您通常期望显示即时消息的方式的相反顺序出现,因此当您向下滚动时消息实际上会变老聊天。
数据库中的message
个节点都有一个与messageTimestamp
相关联的字段,所以这就是我想要对数据进行排序的原因。问题在于,我似乎无法找到一种方法,可以通过我查询的字段以外的任何字段来排序数据,或者从Firebase获取结果并随后对其进行排序。
有谁知道如何解决这个问题,或者是否有一些我不知道的Firebase功能?
提前致谢,
标记
答案 0 :(得分:1)
最简单的方法是在-1
节点中存储一段额外的数据,这是一个纪元时间乘以.orderByChild("messageCreationTime")
:这样你可以对这个字段进行排序,查询将返回正确的顺序。
请参阅此帖子,了解如何获取纪元时间:how to get the number of seconds passed since 1970 for a date value?
但请注意,对于您当前的数据结构,您将遇到一个问题:您需要对此新数据进行排序(例如使用equalTo(mChatId)
)并过滤给定的mChatId(例如{{1} }),这是不可能的。
因此,您必须重新构建数据库(如果可能的话),如下所示:
- messages
- mChatId
- messageUniqueID <- most probably auto-generated by Firebase
- messageTitle: ....
- messageCreationTime: -1525857044
您可以通过以下方式查询:
Query qChatMessages = databaseReference.child("messages").child(mChatId)
.orderByChild("messageCreationTime");