通过2个键对FireBase中的数据进行排序

时间:2019-02-27 17:44:29

标签: android firebase firebase-realtime-database

我构建了游戏应用程序,并将记录保存在FireBase的实时数据库中。 数据库外观:

{
    "Ka8xxTgyFB8yYKH50j" : {
        "score" : 10,
        "seconds" : 1325
    },
    "K222xTgyFBF33FD50j" : {
        "score" : 10,
        "seconds" : 425
    },
    "Ka32T23R328yYKH50j" : {
        "score" : 5,
        "seconds" : 115
    },
    "F323F32FB8yYKH50j" : {
        "score" : 30,
        "seconds" : 2335
    }
    }
}

我想从FireBase中获取按得分排序的数据,然后按秒排序。 在此示例中,数据的正确顺序应为:

得分:5秒:115

得分:10秒:425

得分:10秒:1325

得分:30秒:2335

如何通过其他方式使用orderByChild执行此操作? 谢谢

2 个答案:

答案 0 :(得分:1)

由于firebase不允许进行多重排序,因此我建议您创建一个排序列并根据您的排序要求进行更新。 在您的情况下,您可以将秒和分数连接起来,然后将其存储为整数。为了使其长度一致,必须在秒数上填充0,以表示6个字符(取决于您的得分和秒数的最大可能值)。 可以说,最大分数是100,最大秒数是50000,您的排序顺序是score5 chars of seconds的组合,转换为整数。

示例:

{
    "Ka8xxTgyFB8yYKH50j" : {
        "score" : 10,
        "seconds" : 1325,
        "sort_order": 1001325
    },
    "K222xTgyFBF33FD50j" : {
        "score" : 10,
        "seconds" : 425,
        "sort_order": 1000425
    },
    "Ka32T23R328yYKH50j" : {
        "score" : 5,
        "seconds" : 115
        "sort_order": 5000115
    },
    "F323F32FB8yYKH50j" : {
        "score" : 30,
        "seconds" : 2335,
        "sort_order": 3002335
    }
}

这样,您可以按升序和降序对它进行快速排序。

答案 1 :(得分:0)

您可以尝试这样。 上传时先对数据进行排序。

databaseReference.**orderByValue("score")**.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }

                        });

此后,在获取数据时再次排序

    setmFirebaseAdapter1(new FirebaseRecyclerAdapter<taskdata, wealth.ShowDataViewHolder>(
                taskdata.class, R.layout.budget_rv_layout, wealth.ShowDataViewHolder.class,retrieceds.**orderByChild(seconds)**) {
            public void populateViewHolder(final wealth.ShowDataViewHolder viewHolder, final taskdata model, final int position) {
})