代码之家  ›  专栏  ›  技术社区  ›  jj.badweyn

在我的案例中,哪个Firebase数据结构行为最好?

  •  1
  • jj.badweyn  · 技术社区  · 6 年前

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

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

    所以,我们知道,这看起来像是结构非常糟糕的数据,但正如我们之前所说的,我们需要在 回收视图 此特定教师和其他学生的姓名 FirebaseAuth 用户和有自己的数据,如成绩 每一个意见或批评都是值得赞赏的。

    @编辑此处是我检索数据的方式:) 参考=FirebaseDatabase。getInstance()。getReference(“教师”)。儿童(教师钥匙)。子(“用户”);

     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();
                }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Alex Mamo    6 年前

    根据您的评论,可能的数据库结构如下:

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

    Te输出将为:

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

    如果您有兴趣将这些名称显示在 RecyclerView ,则, this 是如何从Firebase实时数据库中检索数据并将其显示在 回收视图 使用 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为 teacherIdOne ,输出将为:

    Student Name One
    Student Name Two