java - 如何找到玩家上传数据中最大的值(value)

标签 java android firebase firebase-realtime-database

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

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

我的 WriteToFirebase Activity

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 Activity

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

预期结果是屏幕上的 TextView 更改为 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
      }
    }
  }
}

最佳答案

您可以使用 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"
  }
}

关于java - 如何找到玩家上传数据中最大的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57806313/

相关文章:

java - 如何在 JDBC 中使用列表

java - 无法解析 bean driverClassName

java - JEdi​​torPane:HTML 布局损坏

android - Windows 上适用于 Android 的 Golang?

Android 应用程序不兼容但列为兼容

Angular js : How to authenticate before route changes

java - 将源代码附加到 Jprofiler

android - 获取主题的按钮单击颜色

android - ListItem 缺少没有参数的构造函数

firebase - 如何在 BigQuery 中选择多个自定义 Firebase 事件参数?