在Firebase-Android中检索嵌套数据

在Firebase-Android中检索嵌套数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我刚刚进入firebase和android的世界。我按照在线教程设置和获取非嵌套数据,并在listview中显示这些数据,如下所示: 数据之前: 访问整个数据并添加到我的ListView时,我应该做什么?还是我的数据结构不正确 提前谢谢 尝试如下更改firebase代码: myRef = database.getReference().child("Student1").child("Grades"); myRef.addChildEventListener(new ChildEventLis

我刚刚进入firebase和android的世界。我按照在线教程设置和获取非嵌套数据,并在listview中显示这些数据,如下所示:

数据之前:

访问整个数据并添加到我的ListView时,我应该做什么?还是我的数据结构不正确


提前谢谢

尝试如下更改firebase代码:

myRef = database.getReference().child("Student1").child("Grades");
myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        if (dataSnapshot.exists()) {
            String value = dataSnapshot.getValue(String.class);
            String key = dataSnapshot.getKey();
            String totl = key + ": " + value;
            mStudents.add(totl);
            arrayAdapter.notifyDataSetChanged();
        }
    }
});
更新

要访问整个节点
Student1
,可以通过以下方式执行:

ValueEventListener valueEventListener = new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Student student = dataSnapshot.getValue(Student.class);

                Log.d("TAG","name: "+student.getName());
                Log.d("TAG","percentile: "+student.getPercentile());
                Iterator it = student.getGrades().entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry pair = (Map.Entry)it.next();
                    Log.d("TAG","grade: "+pair.getKey() +  " = "  + pair.getValue());
                    it.remove(); // avoids a ConcurrentModificationException
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };

myRef = database.getReference().child("Student1");
myRef.addListenerForSingleValueEvent(valueEventListener);
首先,我已将您的
字段重命名为
课程
,因为
可能会产生混乱和问题(Android本身使用它)。因此,使用表示数据的普通对象创建一个Java文件
Student.Java

public class Student {

    private String Course;
    private String Name;
    private String Percentile;
    private HashMap<String,String> Grades;

    public Student() {

    }

    public Student(String course, String name, String percentile, HashMap<String, String> grades) {
        Course = course;
        Name = name;
        Percentile = percentile;
        Grades = grades;
    }

    public String getCourse() {
        return Course;
    }

    public String getName() {
        return Name;
    }

    public String getPercentile() {
        return Percentile;
    }

    public HashMap<String, String> getGrades() {
        return Grades;
    }
}

尝试按以下方式更改firebase代码:

myRef = database.getReference().child("Student1").child("Grades");
myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        if (dataSnapshot.exists()) {
            String value = dataSnapshot.getValue(String.class);
            String key = dataSnapshot.getKey();
            String totl = key + ": " + value;
            mStudents.add(totl);
            arrayAdapter.notifyDataSetChanged();
        }
    }
});
更新

要访问整个节点
Student1
,可以通过以下方式执行:

ValueEventListener valueEventListener = new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Student student = dataSnapshot.getValue(Student.class);

                Log.d("TAG","name: "+student.getName());
                Log.d("TAG","percentile: "+student.getPercentile());
                Iterator it = student.getGrades().entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry pair = (Map.Entry)it.next();
                    Log.d("TAG","grade: "+pair.getKey() +  " = "  + pair.getValue());
                    it.remove(); // avoids a ConcurrentModificationException
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };

myRef = database.getReference().child("Student1");
myRef.addListenerForSingleValueEvent(valueEventListener);
首先,我已将您的
字段重命名为
课程
,因为
可能会产生混乱和问题(Android本身使用它)。因此,使用表示数据的普通对象创建一个Java文件
Student.Java

public class Student {

    private String Course;
    private String Name;
    private String Percentile;
    private HashMap<String,String> Grades;

    public Student() {

    }

    public Student(String course, String name, String percentile, HashMap<String, String> grades) {
        Course = course;
        Name = name;
        Percentile = percentile;
        Grades = grades;
    }

    public String getCourse() {
        return Course;
    }

    public String getName() {
        return Name;
    }

    public String getPercentile() {
        return Percentile;
    }

    public HashMap<String, String> getGrades() {
        return Grades;
    }
}

这只允许我访问grades字段中的数据。我想访问整个Student1数据进行显示。姓名、班级、百分位数以及成绩。我如何才能做到这一点?addListenerForSingleValueEvent(valueEventListener)和addChildEventListener(childEventListener)之间有什么区别?
addListenerForSingleValueEvent
触发一次,然后不再触发:内部的
ValueEventListener
用于读取和侦听对路径整个内容的更改
addChildEventListener
ChildEventListener
附加到位置:内部的
ChildEventListener
用于接收有关给定数据库引用的子位置中的更改的事件。你可以在这里阅读更多:这里:@ValentinoS。我正试图解决一个类似的问题,我得到一个数据库异常。请检查我的帖子@这只允许我访问成绩字段内的数据。我想访问整个Student1数据进行显示。姓名、班级、百分位数以及成绩。我如何才能做到这一点?addListenerForSingleValueEvent(valueEventListener)和addChildEventListener(childEventListener)之间有什么区别?
addListenerForSingleValueEvent
触发一次,然后不再触发:内部的
ValueEventListener
用于读取和侦听对路径整个内容的更改
addChildEventListener
ChildEventListener
附加到位置:内部的
ChildEventListener
用于接收有关给定数据库引用的子位置中的更改的事件。你可以在这里阅读更多:这里:@ValentinoS。我正在尝试解决一个类似的问题,我得到一个数据库异常。请检查我的帖子@your query here your query here your query here