Firebase仅在有子代的情况下才控制setValue

时间:2019-03-30 13:08:09

标签: android firebase firebase-realtime-database firebase-security

我正在尝试使用规则,但是没有用。

这是结构:

enter image description here

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

但是我想仅在存在子项(键)的情况下才将值设置为“ false”,这样,如果删除该项,我将不会简单地拥有它:

enter image description here

这是我的规则:

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

}

但是,即使子键为空,它仍然会像这样上传数据:

enter image description here

如果有人可以提供帮助,那就很好

编辑2:这是简单得多的规则

"rules": {






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

}
}}}}}

+评论:

因此,如果我添加一个新地图,我总是会用地图更新该项目,但是如果我只更改子地图“ check” ,我会使用“ setValue” 方法并且希望仅当项目已经存在(== child key already exist)

时才执行setValue

2 个答案:

答案 0 :(得分:2)

好吧,您还可以首先检查该子代是否存在,并在正确的情况下执行上述命令。

答案 1 :(得分:1)

如果您仅想在其同级属性checked存在的情况下允许写入key,则可以执行以下操作:

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

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

{
  "has_key" : {
    "key" : "value"
  }
}

因此,这是具有has_key的单个键key。现在,我进行了两个模拟:一个试图写入has_key

由于has_key存在,因此写入has_key/key的操作成功:

Writing to <code>has_key</code> is allowed

由于没有no_key子级,因此拒绝写入no_key/key

Writing to <code>no_key</code> is denied