首页 > 解决方案 > 如何在玩家上传的数据中找到最大的价值

问题描述

我正在尝试为我的应用程序制作一个高分类型的工具,所以我正在玩一些代码并且无法弄清楚搜索多个节点以找到最大价值。问题似乎是 DataSnapshot 将节点作为 HashMap 读取,并且在将值转换为 int 时没有问题。如何阅读信息(球员姓名和球员得分),让 DataSnapshot 识别最大值并将电视设置为该值?

我尝试过的代码如下。我还将添加我的 Firebase 外观的屏幕截图,以使其在视觉上更容易理解

我的 WriteToFirebase 活动

public void gFirebase(View view){

        int score = (int) (Math.random() * ((50)+1));
        Player p1 = new Player();
        p1.setName("Player 1");
        p1.setScore(score);

        DatabaseReference roofRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference gameInfoRef = roofRef.child("hiscore").child("player_name").push();

        gameInfoRef.setValue(p1);

    }

    public void lFirebase(View view){

        int score = (int) (Math.random() * ((50)+1));
        Player p2 = new Player();
        p2.setName("Player 2");
        p2.setScore(score);

        DatabaseReference roofRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference gameInfoRef = roofRef.child("hiscore").child("player_name").push();

        gameInfoRef.setValue(p2);

    }

    public void sFirebase(View view){

        int score = (int) (Math.random() * ((50)+1));
        Player p3 = new Player();
        p3.setName("Player 3");
        p3.setScore(score);

        DatabaseReference roofRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference gameInfoRef = roofRef.child("hiscore").child("player_name").push();

        gameInfoRef.setValue(p3);


    }

我的 ReadFromFirebase 活动

public void readFromFirebase(View view) {

        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference hiscoreRef = rootRef.child("hiscore").child("player_name");
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                int hiscore = 0;
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    int value = ds.getValue(Integer.class);
                    if (hiscore < value) {

                        hiscore = value;

                    }
                    Log.d("TAG", String.valueOf(hiscore));
                    ChangeMe.setText(hiscore);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }

        };
        hiscoreRef.addListenerForSingleValueEvent(eventListener);
}

预期结果是我屏幕上的文本视图更改为我的 Firebase 系统中的最高数字(最高分)

我的数据库的 JSON 树

{
  "hiscore" : {
    "player_name" : {
      "-Lo0W8ks7WCEsrym5Qpl" : {
        "name" : "Player 3",
        "score" : 24
      },
      "-Lo0W92WqeUMdq_y7J8M" : {
        "name" : "Player 2",
        "score" : 42
      },
      "-Lo0W9KjzXE_XCU4K8MN" : {
        "name" : "Player 1",
        "score" : 43
      }
    }
  }
}

标签: javaandroidfirebasefirebase-realtime-database

解决方案


您可以为此使用 Firebase 查询。这将使服务器执行检查,而不必在您自己的代码中执行此操作:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference hiscoreRef = rootRef.child("hiscore").child("player_name");
Query hiscoreQuery = hiscoreRef.orderByChild("score").limitToLast(1);
hiscoreQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        int hiscore = 0;
        for (DataSnapshot ds: dataSnapshot.getChildren()) {
            hiscore = ds.child("score").getValue(Integer.class);
        }
        Log.d("TAG", String.valueOf(hiscore));
        ChangeMe.setText(hiscore);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }

});

您可能会收到有关需要定义索引的警告,在这种情况下,您可以将其添加到 Firebase 安全规则中:

"hiscore": {
  "player_name": {
    ".indexOn": "score"
  }
}

推荐阅读