Firebase返回具有最大价值的孩子

时间:2017-05-24 10:42:16

标签: android firebase firebase-realtime-database

我正在使用firebase一段时间,但我遇到了一个问题,我想让孩子拥有最大的价值:

这里的示例是我的json(手动编辑):



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




我需要获得最高级别的子密钥。 所以我需要" -SKKQuyhso83ds"子。

我使用过这种方法,但它不起作用:

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) {}});

但这不起作用,所以我正在等待一些帮助兄弟。

2 个答案:

答案 0 :(得分:0)

更改此行:

emadefghd

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

其中Query mDatabaseHighestPlayer = mDatabasePlayers.child("Scores").child(scoreId).orderByChild("rank").limitToFirst(1); scoreId方法生成的唯一ID。

答案 1 :(得分:0)

Firebase查询按升序排序。由于您按排名和限制排序第一个结果,因此您将获得最低分数。要获得最高分,请使用limitToLast(1)

此外,当您对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

所以总的来说:

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
    }
});