Android 仅当存在子项时,Firebase规则setValue

Android 仅当存在子项时,Firebase规则setValue,android,firebase,firebase-realtime-database,firebase-security,Android,Firebase,Firebase Realtime Database,Firebase Security,我试图使用规则,但它不起作用 结构如下: 我有以下命令:DeleteItemFromListRef.child(“List”).child(obj.getsEventID()).child(ID).child(“check”).setValue(false) 但我只想在子项(键)存在的情况下将该值设置为“false”,这样,如果删除该项,我就不会简单地得到: 以下是我的规则: "List": { "$listID" : { "$key": { "chec

我试图使用规则,但它不起作用

结构如下:

我有以下命令:
DeleteItemFromListRef.child(“List”).child(obj.getsEventID()).child(ID).child(“check”).setValue(false)

但我只想在子项(键)存在的情况下将该值设置为“false”,这样,如果删除该项,我就不会简单地得到:

以下是我的规则:

 "List": {
    "$listID" : {
      "$key": {
        "check" : {
      ".write":"data.child('List').child($listID).child($key).child('key').exists()"
    }
  }
}
}

但是,如果子密钥为空,它仍然会像这样上载数据:

如果有人能帮忙,那太好了

编辑2:这里有更简单的规则

"rules": {






           "List": {
            "$listID" : {
               "$key": {
                 "check" : {  
".read":"auth.uid != null", 
".write":"auth.uid != null", 
".validate":"data.parent().child('key').exists()"

}
}}}}}
+评论:


因此,如果我添加了一个新的映射,我总是用一个映射更新该项,但是如果我只更改子项“check”,我使用“setValue”方法,并且只希望在该项已经存在的情况下执行setValue(==子项键已经存在)

如果只想允许写入选中的
如果其同级属性
存在,则可以执行以下操作:

"List": {
    "$listID" : {
        "$key": {
            "check" : {
                ".validate":"data.parent().child('key').exists()"
            }
        }
    }
}

更新由于您在执行此操作时遇到困难,我只是在一个非常简单的设置中对其进行了测试。在我的数据库中的
/55431756
下,我有以下JSON:

{
  "has_key" : {
    "key" : "value"
  }
}
所以一个键
有一个
。现在,我运行了两个模拟:一个试图写入
的模拟有\u键

写入
has_key
成功,因为
has_key/key
存在:

写入
no_key
被拒绝,因为没有
no_key/key
子项:


好的,您还可以首先检查子级是否存在,并在为真时执行上述命令

它不起作用,当我将value设置为false并且该项不存在时,我仍然得到了这个结果。。。我用我所有的规则编辑了这个问题。一旦在树中的某个级别授予权限,就不能在较低级别删除它。因此,原始规则中的
“.write”:“true”
“.write”:“auth.uid!=null”
覆盖了较低级别的限制性更强的
。write
。但是,
.validate
应始终为AND。你能用更小的JSON和规则重现这个问题吗,这样我就可以测试它们了?你用“ANDed”来断绝什么?因此,如果我理解得很好,如果我想为我的所有孩子使用单独的规则,我不应该在开始时使用:“.read”:“auth.uid!”空“,”.write:“auth.uid!=null“,”因为它在树中的位置较高,所以读写规则始终是空的?我按照你的建议和评论编辑了我的规则。谢谢你的时间,我刚刚在我自己的数据库上运行了一个测试,规则做了我希望他们做的事情。我不确定你的设置中发生了什么,这就是为什么我分享了我做的整个测试。谢谢你,先生,现在效果更好了。我更了解它的工作方式,它真的很有用。