java - 在我的情况下,哪种 Firebase 数据结构行为最好?
问题描述
我们正在创建一个应用程序,教师可以在其中创建他的班级注册,它应该如下所示:教师创建他的个人资料,然后有一个RecyclerView
显示学生姓名的活动。下面RecyclerView
是TextView
“学生!创建你自己的个人资料”(当然点击它后,有一个创建学生个人资料的活动)。学生只能在创建教师资料时使用与教师相同的设备来创建他的资料。好的,这看起来不错,到目前为止我们已经完成了所有工作,但是我们的问题来了。在这种情况下存储用户数据的最佳行为是什么?我们应该以这种方式构建数据吗?
{
"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();
}
解决方案
根据您的评论,可能的数据库结构可以是:
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 实时数据库中检索数据并将其显示在RecyclerView
using中的方法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
推荐阅读
- javascript - 使用 ion-datetime 在 ionic 中进行时间验证
- python - 如何根据张量流中的列条件获取张量值的索引
- python - 为什么我的 FOR 循环返回 6 个结果而不是 1
- c# - 检测到 Azure 空间锚点后如何删除
- c - “字段”参数从何而来?
- android - 如何在 android Kotlin 中获取特定的 FirebaseAuthUserCollision?
- javascript - 单个 where() 条件导致查询不返回任何内容
- python - 将字符串附加到列表中
- sql - 需要将多行中的一列值组合成一行
- python - 使用 BeautifulSoup 抓取 LinkedIn 时出现 401 错误