java - 如何遍历数据库中的子项并将它们应用于变量

标签 java android firebase firebase-realtime-database

阅读文档后,我了解了如何从数据库中提取单个值,但不确定如何从同一位置提取多个值。例如,我希望按成绩对学生进行排名。所以我使用 orderByChild("grade"),它是一个 int,然后我希望获得前十名,所以我使用 limitToLast(10) 因为较高的等级将排在最后。我对如何遍历并将数据推送到正确的变量感到困惑。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference gradeRef = rootRef.child("test_scores").child("english_grades");
Query gradeRef = gradeRef.orderByChild("grade").limitToLast(10);
gradeRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        // Handling the post

        int gradeOne = 0;
        int gradeTwo = 0;
        int gradeThree = 0;
        String studentOne = "";
        String studentTwo = "";
        String studentThree = "";
        for (DataSnapshot ds: dataSnapshot.getChildren()) {
            gradeOne = ds.child("grade").getValue(Integer.class);
            gradeTwo = ds.child("grade").getValue(Integer.class);
            gradeThree = ds.child("grade").getValue(Integer.class);
            studentOne = ds.child("student").getValue(String.class);
            studentTwo = ds.child("student").getValue(String.class);
            studentThree = ds.child("student").getValue(String.class);
        }
        gradeOne.setText(Integer.toString(gradeOne));
        gradeTwo.setText(Integer.toString(gradeTwo));
        gradeThree.setText(Integer.toString(gradeThree));
        studentNameTV.setText(studentOne);
        studentNameTV2.setText(studentTwo);
        studentNameTV3.setText(studentThree);
    }

{
  "test_scores" : {
    "english_grades" : {
      "-Lo0W8ks7WCEsrym5Qpl" : {
        "name" : "Melissa",
        "grade" : 88
      },
      "-Lo0W92WqeUMdq_y7J8M" : {
        "name" : "Tom",
        "grade" : 95
      },
      "-Lo0W9KjzXE_XCU4K8MN" : {
        "name" : "Andrew",
        "grade" : 89
      }
    }
  }
}

我想从结果中看到的是 StudentName = "Tom"Grade = "95"StudentName = "Andrew"Grade = "89"StudentName = "Melissa"Grade = "88"。

最佳答案

要将数据设置为不同的 View ,请使用以下 for 循环:

for (DataSnapshot ds: dataSnapshot.getChildren()) {
    String name = ds.child("name").getValue(String.class);
    String grade = ds.child("grade").getValue(Integer.class);

    if(name.equals("Tom")) {
        gradeOne.setText(Integer.toString(grade));
        studentNameTV.setText(name);
    }

    if(name.equals("Andrew")) {
        gradeTwo.setText(Integer.toString(grade));
        studentNameTV2.setText(name);
    }

    if(name.equals("Melissa")) {
        gradeThree.setText(Integer.toString(grade));
        studentNameTV3.setText(name);
    }
}

请注意,第二个属性名称是 "name"不是 "student"

关于java - 如何遍历数据库中的子项并将它们应用于变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57823349/

相关文章:

javascript - Firebase startAt 查询给出意外结果

firebase - 如何在Flutter上使用Singleton Firebase服务?

firebase - Firebase版本未通过<npm install -g firebase-tools>更新

java - Spark将多行转换为具有多个集合的单行

Android:检测应用何时完成安装

java - 在 Android Studio 中使用 java 库有困难,在 IDEA 中工作正常

java - 如何制作一个 TextView 来绕过 Android 中的其他 TextView?

java - Java 代码模板的 Eclipse 自定义变量

java - 重启的namenode遭受 block 报告 Storm

java - 如何在输入验证期间显示临时气球工具提示?