如何根据Firebase数据库中的项目数量过滤数据

时间:2016-12-23 21:37:00

标签: android firebase firebase-realtime-database

我正在编写一个Android聊天应用程序,我正在尝试使用自定义FirebaceRecyclerAdapter在RecyrclerView中使用Firebase数据库实现无限滚动。对于第一个消息加载,我使用通过.orderByChild()然后.limitToFirst(specificCount)排序数据的查询从Firebase数据库获取数据。但是,当用户滚动到最后一个可见项目时,我必须得到下一部分消息,问题出现后我没有直接从specialCount之后从Firebase数据库获取消息。我尝试使用该代码:

  int startCount = mLayoutManager.getItemCount();
                FirebaseDatabase
                        .getInstance()
                        .getReference()
                        .child(RequestParameters.FB_CHILD_MESSAGES)
                        .orderByChild(RequestParameters.FB_CHILD_MESSAGES_ORDERING_TIME)
                        .startAt(startCount)
                        .endAt(startCount + CustomFirebaceRecyclerAdapter.NEXT_MESSAGE_PORTION_COUNT)
                        .addListenerForSingleValueEvent(...)

但在我阅读.startAt()的文档后,我意识到这有多愚蠢。任何人都可以帮助进行查询以获取specificCount之后的项目,并将收到的邮件限制为某些计数。

1 个答案:

答案 0 :(得分:2)

我很确定我不到一天前回答了这个问题,所以我建议扫描我的答案。但我会重复一遍。

Firebase数据库API本质上不太适合分页。想想当用户在第1页(前十个项目)时插入项目时会发生什么。他们最终在第2页的开头看到了前一个项目10,但是从未见过新插入的项目。

那就是说,如果你想做分页,那么技术上是可行的。但是,您不必想要跳过 10个项目,而是必须告诉Firebase在上一页的最后一项启动查询。这称为锚项,在代码中它看起来像这样:

FirebaseDatabase
        .getInstance()
        .getReference()
        .child(RequestParameters.FB_CHILD_MESSAGES)
        .orderByChild(RequestParameters.FB_CHILD_MESSAGES_ORDERING_TIME)
        .startAt(timeOfLastItemOnPreviousPage, keyOfLastItemOnPreviousPage)
        .addListenerForSingleValueEvent(...)

这里的关键属性是:

  • timeOfLastItemOnPreviousPage:上一页上最​​后一项的FB_CHILD_MESSAGES_ORDERING_TIME属性值

  • keyOfLastItemOnPreviousPage,上一页上最​​后一项的关键字(如果有多个项目具有相同的FB_CHILD_MESSAGES_ORDERING_TIME

  • ,则需要该项