有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试检索下一张照片中的数据

enter image description here

下面是o从Firebase文档中得到的信息

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<>();

这是课程

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;  }

}

显然有问题,那么数据的价值是什么呢。getValue(Course.class)返回值? 还是我把数据库写错了

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


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

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

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

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

    如果对课程使用相同的键,则仍然会将课程与课程关联:

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

    这将更容易:

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