Android 如何使用相同的getValue(user.class)方法从firebase检索父级和子级的值?

Android 如何使用相同的getValue(user.class)方法从firebase检索父级和子级的值?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我希望在模型类中同时从父节点和子节点检索数据。比如说: Students: { Student1: { id: 1, name: "Sam", regNo: "15001" 1stSmester: { c: 70, dataStructures:80, },

我希望在模型类中同时从父节点和子节点检索数据。比如说:

Students: {
      Student1: {
            id: 1,
            name: "Sam",
            regNo: "15001"
              1stSmester: {
                      c: 70,
                     dataStructures:80,
                      },
              2ndSemester: {
                        CPlus:85,
                        sql:68
                      }
                 }
      Student2: {
              id:2,
              name:"Rob",
              regNo:"15002"
                1stSemester: {
                       c:59,
                      dataStructures:77
                         },
                 2ndSemester: {
                        CPlus:60,
                        sql: 85
                          }
                  }
所以,我的问题是如何从student1和student2检索所有数据?因此,它的父值以及1stSemester和2ndSemester子值作为两个单独的对象,并将其映射到我自己的模型类

提前感谢您的帮助

您可以使用库来反序列化模型。我想象你的模型是这样的:

Class Student{
  int id,regNo; 
  String name;
  Semester 1stSemester;
  Semester 2ndSemester;

class Semester{
    int c;
    int CPlus;
    int sql;
    int dataStructures;
    } 
}
然后在代码中使用:

Gson gson = new Gson();
gson.fromJson(yourResponse,Student.class);

让学生和学期上课

class Students {
int id;
String name, regNo;
Semester semester1, semester2;

 public Semester getSemester1() {
    return semester1;
    }
   ...
}
 class Semester {
    String courseName;
    double result;
}
更新

内部类必须在外部声明,并且必须为内部类对象设置setter和getter

要求提供数据

  FirebaseDatabase.getInstance().getReference().child("Students")
    .addValueEventListener(new ValueEventListener(){
  @Override
   public void onDataChange(DataSnapshot dataSnapshot){
    if(dataSnapshot.exists()){
    ArrayList<Student> allStudents=
  (ArrayList<Student>)dataSnapshot.getValue();
    }

   @Override
    public void onCancelled(DatabaseError databaseError){

    }
    });
    }
FirebaseDatabase.getInstance().getReference().child(“学生”)
.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
ArrayList所有学生=
(ArrayList)dataSnapshot.getValue();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}

您的数据结构似乎与Firebase保持数据模型扁平化的最佳实践背道而驰。考虑到这一点和问题的广泛性,我建议你研究这个问题,并接受“是的”,我会这样做。但是你能告诉我如何使上面的数据结构扁平化吗?我是firebase的新手,所以对此我不太了解。而且,在我的应用程序中,我必须将学生作为一个对象,并在recyclerView中显示它。我仍然可以使用平面数据模型吗?您可以演示如何从Firebase
DataSnapshot
中获取
响应吗?我认为您可以尝试使用getValue,因为它返回对象,然后将其强制转换为string@Rahim我真的不明白你的Gson代码,我真的可以这样做吗?如何在getValue()中使用gson作为getValue,只接受一个参数。@RahimRahimli:那不行。不幸的是,
DataSnapshot.toString()
没有返回JSON,而且
Object.toString()
是任何人的猜测。那么
String yourResponse=(String)DataSnapshot.getValue()
我已经尝试了你的代码,但是如何检索firebase的内部对象呢。我尝试使用getter,但它显示值为0。您是否在内部类中提供了getter setter?我尝试了您的代码,但您已将子类声明为外部类。因为如果创建内部类,它会显示databaseException。否则一切都没问题。是的,我知道了。问题是您必须将内部类声明为外部类,并且还必须为类对象设置getter和setter。我已经更新了答案。请复习一下。