首页 > 解决方案 > 在我的情况下,哪种 Firebase 数据结构行为最好?

问题描述

我们正在创建一个应用程序,教师可以在其中创建他的班级注册,它应该如下所示:教师创建他的个人资料,然后有一个RecyclerView显示学生姓名的活动。下面RecyclerViewTextView“学生!创建你自己的个人资料”(当然点击它后,有一个创建学生个人资料的活动)。学生只能在创建教师资料时使用与教师相同的设备来创建他的资料。好的,这看起来不错,到目前为止我们已经完成了所有工作,但是我们的问题来了。在这种情况下存储用户数据的最佳行为是什么?我们应该以这种方式构建数据吗?

{
  "Teachers" : {
    "USYSacnOjDR5EAPwljZMHtggN9I2" : {
      "teachername" : {
        "teachername" : "Janis"
      },
        "students" : {
          "0xgMzfOLLwQ2KWF7aKhH5ZIbQnx2":{
            "studentname": "Pavel"

         }
      }
    }
  },

所以,这看起来像是结构很糟糕的数据,我们知道,但就像我们之前说的,我们需要在RecyclerView这个特定教师的名字中显示其他FirebaseAuth用户并且有自己的数据,比如成绩每一个意见或批评都是值得赞赏的。

@Edit 这里是我检索数据的方式:) reference=FirebaseDatabase.getInstance().getReference("teachers").child(teacherkey).child("users");

 reference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                User user = dataSnapshot.child("name").getValue(User.class);
                result.add(user);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                User user = dataSnapshot.child("name").getValue(User.class);
                result.remove(user);
                adapter.notifyDataSetChanged();
            }

标签: javaandroidfirebasefirebase-realtime-databasefirebase-authentication

解决方案


根据您的评论,可能的数据库结构可以是:

Firebase-root
   |
   --- teachers
   |     |
   |     --- teacherIdOne
   |     |      |
   |     |      --- "teacherName" : "Teacher Name One"
   |     |      |
   |     |      --- students:
   |     |             |
   |     |             --- studentIdOne: "Student Name One"
   |     |             |
   |     |             --- studentIdTwo: "Student Name Two"
   |     |
   |     --- teacherIdTwo
   |            |
   |            --- "teacherName" : "Teacher Name Two"
   |            |
   |            --- students:
   |                   |
   |                   --- studentIdThree: "Student Name Three"
   |                   |
   |                   --- studentIdFour: "Student Name Four"
   |
   --- students
         |
         --- studentIdOne
         |      |
         |      --- "studentName" : "Student Name One"
         |
         --- studentIdTwo
         |      |
         |      --- "studentName" : "Student Name Two"
         |
         --- studentIdThree
         |      |
         |      --- "studentName" : "Student Name Three"
         |
         --- studentIdFour
         |      |
         |      --- "studentName" : "Student Name Four"
         |
         --- studentIdFive
                |
                --- "studentName" : "Student Name Five"

要显示所有 5 名学生的姓名,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference studentsRef = rootRef.child("students");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String studentName = ds.child("studentName").getValue(String.class);
            Log.d("TAG", studentName);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
studentsRef.addListenerForSingleValueEvent(valueEventListener);

输出将是:

Student Name One
Student Name Two
Student Name Three
Student Name Four
Student Name Five

如果您有兴趣将这些名称显示到 中RecyclerView是您可以从 Firebase 实时数据库中检索数据并将其显示在RecyclerViewusing中的方法FirebaseRecyclerAdapter

如果要显示特定教师的学生,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference studentsRef = rootRef.child(teachers).child(teacherId).child("students");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String studentName = ds.getValue();
            Log.d("TAG", studentName);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
studentsRef.addListenerForSingleValueEvent(valueEventListener);

其中teacherId是您要显示其学生的老师的 ID。如果老师的 id 是 example teacherIdOne,输出将是:

Student Name One
Student Name Two

推荐阅读