从Firebase获取嵌套数据并进行相应排序

时间:2018-12-14 14:12:55

标签: java android firebase firebase-realtime-database collections

我在FirebaseRealTimeDatabase中存储了一堆嵌套数据,如下所示:

Database structure

我能够检索数据集,即配置文件及其各自的分数。

ArrayList<String> profileNameList = new ArrayList();
ArrayList<String> profileStatusList = new ArrayList();
ArrayList<int> scoreList = new ArrayList();

databaseReference.child("players")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Iterable<DataSnapshot> children = dataSnapshot.getChildren();

                    for (DataSnapshot child : children) {
                        Profile profile = child.child("profile").getValue(Profile.class);
                        Scores scores= child.child("scores").getValue(Scores.class);

                        profileNameList.add(profile.getName());
                        profileStatusList.add(profile.getStatus());
                        scoreList.add(scores.getScore());
     }
  }

然后,我使用Collections.sort(scoreList)对分数从最低到最高进行排序。但是,我面临的挑战是,如何将排序后的分数(从最低到最高)再次与玩家资料相关联,例如

  Gavin - 15
  Rico - 40

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

要解决此问题,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playersRef = rootRef.child("players");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("profile").child("name").getValue(String.class);
            long score = ds.child("score").child("baseball").getValue(Long.class);
            Log.d(TAG, name + " - " + score);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
playersRef.addListenerForSingleValueEvent(valueEventListener);

您的logcat中的结果将是:

Rico Hernandes - 40
Gavin Muro - 15