父和子的单独的firebase数据库规则

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了父和子的单独的firebase数据库规则相关的知识,希望对你有一定的参考价值。

我的数据库结构如此......

Database structure

我希望对“users / uid”和“users / uid / locations / $ address / latlng”节点有不同的读/写规则。

    "users": {
    "$uid": {

    ".read": "auth != null && $uid == auth.uid",
    ".write": "auth != null && $uid == auth.uid",

      "locations": {
        "$address": {
          "latlng": {

            ".read": true,
            ".write": false,

          }
        }
      }
    }
  }

由于规则级联,似乎这是不可能的。读写都在我希望失败的地方传递。基本上,我希望用户能够在locations节点下创建地址和latlng节点,但只允许某些用户在地址节点下创建其他节点。

这是可能的还是我需要以不同的方式构建我的数据库?

编辑:

这是我将信息存储到数据库的代码

   mRootRef.child("users").child(user.getUid()).child("locations").child(currentAddress).child("latlng").setValue(currentLatLng.latitude + "," + currentLatLng.longitude);

这是我从数据库中检索信息的代码

mRootRef.child("users").child(user.getUid()).child("locations").child(selectedItem).child("verified").addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        //Check if address is verified

                        if(dataSnapshot.getValue() == null){

                            ChangeVerifiedMessage(false);
                            return;

                        }

                        if (dataSnapshot.exists()){

                            ChangeVerifiedMessage(true);

                            }else{

                            ChangeVerifiedMessage(false);

                            }

                        }
答案

您可以尝试使用validation来实现您想要的效果。您可以验证,在特定情况下,子项(在您的情况下为latlng)不存在。验证不是级联的,因此您只需用它替换写规则即可。这可能是一个小小的解决方法,但是在没有重组数据的情况下我想到的唯一想法。

以上是关于父和子的单独的firebase数据库规则的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 规则通配符和子级比较

ats 分层缓存

片段之间的共享数据(父列表视图和子列表视图)

如何从 Firebase 获取数据到 Recyclerview 中的片段?

片段中的Firebase数据不是持久的,会重新下载

从 Android Studio 中的片段将数据写入 Firebase