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

时间:2018-05-17 13:13:36

标签: java android firebase firebase-realtime-database firebase-authentication

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

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

         }
      }
    }
  },

所以,这看起来像veeery结构糟糕的数据,我们知道,但就像我们之前所说,我们需要在RecyclerView中显示这些特定教师学生的名字,这些学生是其他FirebaseAuth用户和有自己的数据,如成绩 每个观点或批评都表示赞赏。

@Edit这里是我如何检索数据:)     参考= FirebaseDatabase.getInstance()getReference( “教师”)子(teacherkey).child( “用户”);。。

 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 个答案:

答案 0 :(得分:2)

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

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实时数据库中检索数据并将其显示在{{1使用RecyclerView

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

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); 是您要显示其学生的教师的ID。如果教师的ID是例如teacherId,则输出将为:

teacherIdOne