2017-08-16 63 views
0

检索嵌套的对象我想以检索数据作为下一张照片如何火力数据

enter image description here

这里就是Ø从火力地堡文档得到

mCoursesChild.child("Courses").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot data : dataSnapshot.getChildren()) { 
       Course temp = data.getValue(Course.class); 
      courses.add(temp)); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
    } 
}); 

和“课程“被定义为ArrayList

ArrayList<Course> courses = new ArrayList<>(); 

这里是Cours E级

public class Course { 

    private String mCourseName; 
    List<Subject> mSubjects; 

    public Course(){}  // Default constructor required for calls to DataSnapshot.getValue(Course.class) 

    public Course(String CourseName){ 
     mCourseName = CourseName; 
    } 

    public String getcourseName(){ 
     return mCourseName; 
    } 
    public List<Subject> getSubjects(){ return mSubjects; } 

} 

显然出了点问题,那么什么是data.getValue(Course.class)返回的值? 还是我写错了数据库?

PS:我写的数据库对象手动

+1

应避免在火力堂妹嵌套结构,创建复杂时增加数据检查火力地堡文档https://firebase.google.com/docs/database/android/structure-data –

回答

1

我看到一些不匹配在你的代码VS的JSON属性的命名。火力地堡后续JavaBean属性命名约定,这意味着该消气:

public List<Subject> getSubjects(){ return mSubjects; } 

映射到一个名为subjects属性。在您的JSON中,该属性名称为Subjects,与此不匹配。要解决这个问题,无论是拼在你的JSON subjects或注释,吸气:

@PropertyName("Subjects") 
public List<Subject> getSubjects(){ return mSubjects; } 

除此之外,由于阿纳斯说:在火力地堡文档和专家建议保持你的数据结构扁平你JSON的每个分支限制单一类型。

在你的情况,这意味着我会建议保持三个独立的顶级名单:

  1. 课程
  2. 教训
  3. 问题

如果使用了相同的密钥课程中,您仍将课程与课程相关联:

Courses 
    CourseId1 
    Name: "Algebra" 
Lessons 
    CourseId1 
    LessonId1 
     Name: "Algebra week 1" 

这将使它更容易:

  • 只读您需要的数据。
  • 确保用户只能访问他们授权的数据。
+0

谢谢,固定它对,我用你提到的新层次重新创建了数据库,并且它工作得很好 –