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中显示它。我仍然可以使用平面数据模型吗?您可以演示如何从FirebaseDataSnapshot
中获取响应吗?我认为您可以尝试使用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。我已经更新了答案。请复习一下。