父级和子级的独立Firebase数据库规则

时间:2018-07-21 23:26:17

标签: firebase firebase-realtime-database

我的数据库的结构是如此……

Database structure

我想对“用户/ uid”和“用户/ uid /位置/ $ 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节点,但只能让某些用户在address节点下创建其他节点。

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

编辑:

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

   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);

                            }

                        }

1 个答案:

答案 0 :(得分:1)

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