首页 文章

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

提问于
浏览
0

我正在编写一个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 回答

  • 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

相关问题