Firebase return child that have biggest value

天大地大妈咪最大 提交于 2019-12-24 06:57:35

问题


I am using firebase for a little while but I have stuck at one problem that I want to get the child that have the biggest value:

Example here's my json (edited manually):

{
  "Players" : {
    "Scores" : {
      "-JFUIwudw93dkD" : {
        "rank" : 0
      },
      "-KSFOW833nSfkod" : {
        "rank" : 8
      },
      "-Kk5WfuJ8mlZTPdeUC40" : {
        "rank" : 2
      },
      "-SKKQuyhso83ds" : {
        "rank" : 14
      }
    }
  },

I need to get the child key for the highest rank. So I need the "-SKKQuyhso83ds" child.

I have use this method but It doesn't work:

final DatabaseReference mDatabasePlayers = FirebaseDatabase.getInstance().getReference().child("Players");
    Query mDatabaseHighestPlayer = mDatabasePlayers.child("Scores").orderByChild("rank").limitToFirst(1);
    mDatabaseHighestPlayer.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot){
            //This returns null
            String Key = dataSnapshot.getKey();
            Toast.makeText(main.this,Key,Toast.LENGTH_LONG).show();}
        @Override
        public void onCancelled(DatabaseError databaseError) {}});

but that doesn't work so I'am waiting for some help brothers.


回答1:


Firebase queries are ordered ascending. Since you order by rank and limit to the first result, you'll get the lowest score. To get the highest score, use limitToLast(1).

In addition, when you execute a query against the Firebase Database, there will potentially be multiple results. So the snapshot contains a list of those results. Even if there is only a single result, the snapshot will contain a list of one result.

So in total:

DatabaseReference mDatabasePlayers = FirebaseDatabase.getInstance().getReference().child("Players");
Query mDatabaseHighestPlayer = mDatabasePlayers.child("Scores").orderByChild("rank").limitToLast(1);
mDatabaseHighestPlayer.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot){
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            String Key = childSnapshot.getKey();
            Toast.makeText(main.this,Key,Toast.LENGTH_LONG).show();
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // don't swallow errors
    }
});



回答2:


Change this line:

Query mDatabaseHighestPlayer = mDatabasePlayers.child("Scores").orderByChild("rank").limitToFirst(1);

with

Query mDatabaseHighestPlayer = mDatabasePlayers.child("Scores").child(scoreId).orderByChild("rank").limitToFirst(1);

In which scoreId is the unique id generated bu the push() method.



来源:https://stackoverflow.com/questions/44156023/firebase-return-child-that-have-biggest-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!