简体   繁体   English

如何从Firebase数据库获取排序的数据?

[英]How to get sorted data from Firebase Database?

How I can get TOP three users(maybe in HashMap) with name and userScore from all users in Firebase Database? 我如何从Firebase数据库中的所有用户那里获得名称和userScore为前三名的用户(可能在HashMap中)? HashMap must be order by userScore . HashMap必须由userScore排序 Or get ArrayList<User> usersList with three sorted users by userScore. 或通过userScore ArrayList<User> usersList具有三个已排序用户的ArrayList<User> usersList usersList。 database 数据库

{"top_clicker_db" : { 
    "total_clicks" : 3401,
    "user" : {
      "-KkePRVzO_lLLgp7fqX0" : {
        "name" : "fly",
        "userScore" : 2000
      },
      "-KkjWk0L2lR8RwUXF2Bd" : {
        "name" : "lg",
        "userScore" : 24
      },
      "-KkjjxNw8fj_XG9uUPEg" : {
        "name" : "fjfg",
        "userScore" : 304
      },
      "-KkjoakdLIjYlBEM1pkq" : {
        "name" : "Geny",
        "userScore" : 100
      },
      "-KklVAOkk2WJaRmH9cKk" : {
        "name" : "fly",
        "userScore" : 941
      }
    }
  }
}

I need: 我需要:

fly=2000;
fly=941;
fjfg=304;

To solve the problem in easiest way possible i recomand you change you database structure like this: 为了以最简单的方式解决问题,我建议您更改数据库结构,如下所示:

{"top_clicker_db" : { 
    "total_clicks" : 3401,
    "user" : {
      "-KkePRVzO_lLLgp7fqX0" : {
        "fly" : 2000
      },
      "-KkjWk0L2lR8RwUXF2Bd" : {
        "lg" : 24
      },
      "-KkjjxNw8fj_XG9uUPEg" : {
        "fjfg" : 304
      },
      "-KkjoakdLIjYlBEM1pkq" : {
        "Geny" : 100
      },
      "-KklVAOkk2WJaRmH9cKk" : {
        "fly" : 941
      }
    }
  }
}

You need a single child with the user name as the key and the score as the value . 您需要一个孩子, the user name as the keythe score as the value The benefits of this structure is that you need to query just once . 这种结构的好处是您只需要查询一次 To achieve this, please use the following code: 为此,请使用以下代码:

DatabaseReference yourRef = FirebaseDatabase.getInstance().getReference().child("top_clicker_db").child("user").child(userId);
Query query = yourRef.child(userName).orderByValue().limitToFirst(3);
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.d("TAG", dataSnapshot.getKey() + "=" + dataSnapshot.getValue());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
query.addListenerForSingleValueEvent(eventListener);

Hope it helps. 希望能帮助到你。

You said you cannot change your database structure in the comment in @alex-mamo 's answer, but how about adding a new node? 您说您无法在@ alex-mamo的答案中的注释中更改数据库结构,但是如何添加新节点?

If you can, denormalize your data may also be a good solution. 如果可以的话,对数据进行非规范化也是一个很好的解决方案。 https://firebase.google.com/docs/database/web/structure-data https://firebase.google.com/docs/database/web/structure-data

"total_clicks" : 3401,
"user" : {
  "-KkePRVzO_lLLgp7fqX0" : {
    "name" : "fly",
    "userScore" : 2000
  },
  "-KkjWk0L2lR8RwUXF2Bd" : {
    "name" : "lg",
    "userScore" : 24
  ...
},
"scores" : {
  "-KkePRVzO_lLLgp7fqX0" : {
    "fly" : 2000
  },
  "-KkjWk0L2lR8RwUXF2Bd" : {
    "lg" : 24
  },
  ...
}

I solved the problem. 我解决了问题。 But now I think how I can limited my list only for 3 users. 但是现在我想我如何只能限制3个用户的list

userRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                getTopThreeUsers((Map<String, Object>) dataSnapshot.getValue());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });

private void getTopThreeUsers(Map<String, Object> users) {
        HashMap<String, Long> namesAndScores = new HashMap<>();
        for (Map.Entry<String, Object> entry : users.entrySet()) {
            Map singleUser = (Map) entry.getValue();
            namesAndScores.put((String) singleUser.get("name"), (Long) singleUser.get("userScore"));
        }
        Set<Map.Entry<String, Long>> set = namesAndScores.entrySet();
        List<Map.Entry<String, Long>> list = new ArrayList<>(set);
        Collections.sort(list, new Comparator<Map.Entry<String, Long>>() {
            public int compare(Map.Entry<String, Long> o1, Map.Entry<String, Long> o2) {
                return (o2.getValue()).compareTo(o1.getValue());
            }
        });

        topName1.setText(list.get(0).getKey());
        topName2.setText(list.get(1).getKey());
        topName3.setText(list.get(2).getKey());

        topScore1.setText(String.valueOf(list.get(0).getValue()));
        topScore2.setText(String.valueOf(list.get(1).getValue()));
        topScore3.setText(String.valueOf(list.get(2).getValue()));
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM