首页 > 解决方案 > 如何从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"
      }
    }

标签: javaandroidfirebasefirebase-realtime-database

解决方案


您的代码尝试从中读取getReference("users").child("Blog"),这有两个问题:

  1. 路径上没有数据/users/Blog
  2. 没有人有权阅读/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"
  }
}

推荐阅读