Firebase查询 - 如何按单独的字段排序?

时间:2018-05-09 08:43:54

标签: android firebase firebase-realtime-database

我正在使用一个充当即时消息服务的Android应用程序,而我正在将消息数据提取到RecyclerView。我让我的Firebase Query对象返回与已加载的聊天的id匹配的所有邮件,这样做是这样的:

Query qChatMessages = mDbRefMessages
    .orderByChild("messageChat")
    .equalTo(mChatId);

到目前为止一切都那么好,而这正在返回我期望的消息集合。现在的问题是,在将它们传递给要显示的RecyclerView时,它们会按照您通常期望显示即时消息的方式的相反顺序出现,因此当您向下滚动时消息实际上会变老聊天。

数据库中的message个节点都有一个与messageTimestamp相关联的字段,所以这就是我想要对数据进行排序的原因。问题在于,我似乎无法找到一种方法,可以通过我查询的字段以外的任何字段来排序数据,或者从Firebase获取结果并随后对其进行排序。

有谁知道如何解决这个问题,或者是否有一些我不知道的Firebase功能?

提前致谢,

标记

1 个答案:

答案 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");