如何通过分页在Firebase中实时降序?

时间:2019-11-29 16:58:22

标签: android firebase firebase-realtime-database

我正在查询并尝试通过评分字段下订单。这是分页列表,因此我在进行部分查询。

但是我的查询未排序。

   private void callRealOnlineUsersList(int page, String neededGender) {
    DatabaseReference mReference = realtimeReference.child("OnlineUsers/" + neededGender);
    Query query = mReference.limitToLast(page * TOTAL_ITEMS_TO_LOAD);
    query.orderByChild("rating");
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            final List<OnlineUser> userList = new ArrayList<>();
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                OnlineUser user = postSnapshot.getValue(OnlineUser.class);
                userList.add(new OnlineUser(user.getUid(), user.getName(), user.getImage(), user.getGender(), user.getCountry(), user.getRating()));
            }
            EventBus.getDefault().post(new ListEvent(userList));
        }

日志是

 D/testList: rating 2
            D/testList: rating 1
            D/testList: rating 25
            D/testList: rating 3
            D/testList: rating 1
            D/testList: rating 4
            D/testList: rating 1
            D/testList: rating 10
            D/testList: rating 2
            D/testList: rating 1
            D/testList: rating 25

数据快照 enter image description here

1 个答案:

答案 0 :(得分:1)

因此,您将3个问题合并为1个:

  • 为什么我的代码根本不排序
  • 为什么我不能按降序排序?
  • 给出一个有效的查询,我该如何在Android上使用Firebase RTDB进行分页?

好消息,其中的后2个在StackOverflow上已有很好的答案!

首先,您在这里使用Query的方式:

Query query = mReference.limitToLast(page * TOTAL_ITEMS_TO_LOAD);
query.orderByChild("rating");

是不正确的(这就是为什么您根本没有得到排序结果 的原因。)

相反,请尝试以下操作:

Query query = mReference
                 .limitToLast(page * TOTAL_ITEMS_TO_LOAD)
                 .orderByChild("rating");

如果您仅调用orderByChild,它将返回执行该查询的查询,但是在您的代码中您将忽略结果。

为帮助您更清楚地了解正在发生的事情,您也可以这样做并且可以正常工作(但是您当前的代码无法保存orderByChild调用的结果:

Query query = mReference.limitToLast(page * TOTAL_ITEMS_TO_LOAD);
query = query.orderByChild("rating");

第二,you can't sort by descending order in Firebase RTDB,因此您应该查看该问题以寻求可能的解决方案。

最后,随着page的增加,您当前的代码将总是返回越来越多的结果-您不一定总是得到TOTAL_ITEMS_TO_LOAD的结果。有关分页is here的更完整的SO问题。