如何检索firebase数据中的嵌套对象

时间:2017-08-16 12:32:25

标签: java android firebase firebase-realtime-database

我试图像下一张照片中那样检索数据

enter image description here

以及来自Firebase文档的内容

String text = et_pwd.getText().toString().trim();
if (text.equalsIgnoreCase("")) {
     // empty/blank string
}else {
     // not blank string
}

和"课程"被定义为ArrayList

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<Course> courses = new ArrayList<>();

显然出现了问题,那么data.getValue(Course.class)的值是多少呢? 或者我是以错误的形式编写数据库?

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

1 个答案:

答案 0 :(得分:2)

我发现代码中的一些不匹配与JSON属性的命名有关。 Firebase遵循JavaBean属性命名约定,这意味着这个getter:

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

映射到名为subjects的媒体资源。在您的JSON中,该属性名为Subjects,不匹配。要解决此问题,请在JSON中拼写subjects或注释getter:

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

除此之外,正如Anas评论的那样:Firebase文档和专家建议通过将JSON的每个分支限制为单一类型来保持数据结构的平坦。

在您的情况下,这意味着我建议保留三个单独的顶级列表:

  1. 课程
  2. 吸取
  3. 问题
  4. 如果您在课程中使用相同的键,您仍然会将课程与课程相关联:

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

    这样可以更容易:

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