java - 如何从firebase中的所有用户中检索特定的子数据
问题描述
我正在创建一个博客应用程序,用户可以在使用他们的帐户登录后发布。我的问题是我希望能够显示所有用户的所有博客。在所有用户的 Uid 下都有一个名为 Blog 的子项,我想将其显示在我的仪表板上,因此当用户使用他们的帐户登录时,他们能够看到其他用户的博客。我希望问题很清楚。任何人都可以帮助我。谢谢你。
这是我的代码,但这给了我错误权限被拒绝,
private void loadPost() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users").child("Blog");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
postList.clear();
for (DataSnapshot ds: dataSnapshot.getChildren()){
ModelPost modelPost = ds.getValue(ModelPost.class);
postList.add(modelPost);
adapterPost = new AdapterPost(getActivity(), postList);
recyclerView.setAdapter(adapterPost);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(getActivity(), ""+databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
这是我的数据库。
这是我的数据库安全规则
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
解决方案
您的代码尝试从中读取getReference("users").child("Blog")
,这有两个问题:
- 路径上没有数据
/users/Blog
。 - 没有人有权阅读
/users/Blog
。
您的规则允许用户阅读他们自己的节点,包括博客文章和个人资料信息。要阅读用户自己的博客文章,您会听到:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users").child(uid).child("Blog")
请注意,这不允许用户阅读所有用户的所有博客文章。事实上,在您当前的模型中,如果不授予他们读取所有用户配置文件的权限,这是不可能的,我认为这不是您想要的。
如果您想允许用户阅读所有博客文章,但只允许他们访问自己的个人资料,则需要创建两个单独的顶级节点:
profiles: {
uid1: {
}
uid2: {
}
}
blogs: {
uid1: {
blogid1: { ... }
blogid2: { ... }
}
uid2: {
blogid3: { ... }
blogid4: { ... }
}
}
或者,您可以将最后一个结构中的博客建模为:
blogs: {
blogid1: { uid: "uid1". ... }
blogid2: { uid: "uid1". ... }
blogid3: { uid: "uid2". ... }
blogid4: { uid: "uid2". ... }
}
无论哪种情况,您现在都可以通过以下方式允许访问:
"rules": {
"profiles": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"blogs": {
".read": true"
}
}
推荐阅读
- java - 完成未来打多个休息服务并结合结果
- python - Django - 初始页面加载时保存的表单字段中的字体大小很小,直到单击/击键
- python-3.x - 如何在python中选择行
- php - 有没有办法用 2 个不同的盐键解密一个字符串以获得 2 个不同的结果
- python - 警告:找不到库:Qt5WebKitd.dll、Qt5Cored.dll pyinstaller
- kubernetes - kubernetes - 如何让一份工作与多个节点一起工作?
- vcf-vcard - vCard 4.0 无法正确显示,标签被忽略,字符解码错误等
- angular - Spring Boot:如何将 Autocad 转换为 GeoJSON?
- python - next(iter(..)) 函数产生错误
- java - 在 HashSet 中存储坐标