java - 如何在玩家上传的数据中找到最大的价值
问题描述
我正在尝试为我的应用程序制作一个高分类型的工具,所以我正在玩一些代码并且无法弄清楚搜索多个节点以找到最大价值。问题似乎是 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
}
}
}
}
解决方案
您可以为此使用 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"
}
}
推荐阅读
- kotlin - 如何在 Kotlin 中使用 LinkedHashSet 插入一个又一个元素
- javascript - WebSocket 会发出什么错误?
- javascript - 如何从可观察数组中的可观察数组中删除项目
- angular - 在新选项卡中打开应用程序页面时出现 Angular Service Worker 问题
- python - Django REST 框架 - MultiSelectField - TypeError:“set”类型的对象不是 JSON 可序列化的
- azure-application-gateway - 我应该将证书放在 App Gw 和 Web App 级别
- java - 如何在没有任何功能文件的情况下运行黄瓜?
- java - 在我的 java 表中看不到列数据,问题
- sql - 如何根据特定文本在 SQL 中创建循环?
- php - 通过他们在 php 中的 API 清除 Cloudflare 缓存