Firebase 规则如何在其父级被删除时防止添加或更新值

Firebase Rules how to prevent add or update value if its parent is deleted

我在问我是否有这个 firebase 数据库

Misters
 + 7m1fyYchDscr8tUeI13uPXvdDvM2
 + gvTVc3gwRfTz3WL48vTGiiiTKZ22
 - vWZ55LGiraaIErIiiVN4NVQc6Eh1
     active_type:true
     age: 27

如果父节点已删除,如何防止添加新节点或更新现有节点 (vWZ55LGiraaIerIiiVN4NVQc6Eh1)?

例如我有阻止更新的规则

{
    "rules": {
        ".read": true,
        ".write": "auth != null",
        "Misters": {
            "$Misterid": {
                "active_type:true": {

                    ".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
                }
            }
        }
    }

但是如果找不到父节点我想阻止

基本上,如果我理解正确的话,您的写入操作将重新创建已删除的 "vWZ55LGiraaIErIiiVN4NVQc6Eh1"。

所以我会这样做:

{
    "rules": {
        ".read": true,
    ".write": "auth != null",
    "Misters": {
        ".write" : "root.child('Misters').hasChild(<Misterid>)"
        "$Misterid": {
            "active_type:true": {

                ".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
            }
        }
    }
}
  1. 将所有添加的 $Misterid 存储在名为 MistersAdded 的新节点中。这可以通过使用云函数自动完成
  2. 添加以下规则

这包括一个 exists() 方法,该方法将检查 MistersAdded 地图以查看它是否已被创建。如果您希望能够让用户删除地图,请添加 '|| data.val() == null' 写规则后面。

{
    "rules": {
        ".read": true,
        ".write": "auth != null",
        "Misters": {
            "$Misterid": {
                "active_type:true": {
                    ".write": !root.child('MistersAdded').child($Misterid).exists()
                    ".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
                }
            }
        }
    }

你真的想在 "rules" 做吗?这意味着您不能在应用逻辑时有选择性。我建议以编程方式进行。

 DatabaseReference mDatabase = FirebaseDatabase.getInstance();
    rootRef = mDatabase.child("vWZ55LGiraaIErIiiVN4NVQc6Eh1");
    addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      void onDataChange(DataSnapshot snapshot) {
        if (snapshot.exists()) {
          // run some code here if node exists
        } else { 
            // run some code here if node does not exist
        }
      }
    });

希望对您有所帮助。这样做意味着您可以做的不仅仅是验证,您甚至可以通知您的用户并执行 UI 操作。