Java 如何从firebase中的所有用户检索特定的子数据

Java 如何从firebase中的所有用户检索特定的子数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在创建一个博客应用程序,用户可以在使用其帐户登录后发布。我的问题是,我希望能够显示所有用户的所有博客。在所有用户及其Uid下都有一个名为Blog的子项,我想将其显示在仪表板上,因此当用户使用其帐户登录时,他们可以看到其他用户的Blog。我希望问题很清楚,有人能帮我吗。多谢各位 这是我的代码,但这给了我错误权限被拒绝 private void loadPost() { DatabaseReference ref = FirebaseDatabase.getInstan

我正在创建一个博客应用程序,用户可以在使用其帐户登录后发布。我的问题是,我希望能够显示所有用户的所有博客。在所有用户及其Uid下都有一个名为Blog的子项,我想将其显示在仪表板上,因此当用户使用其帐户登录时,他们可以看到其他用户的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"
      }
    }
    

    还请添加错误堆栈跟踪。要允许用户写入
    “/blogs”
    ,并能够编辑/删除他们自己的博客文章,您还需要
    ”.write:“(!newData.exists()|| newData.child('uid').val()==auth.uid)和(!data.exists()| data.child('uid').val()==auth.uid)”
    。这是否意味着我必须更改数据库结构