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“,”因为它在树中的位置较高,所以读写规则始终是空的?我按照你的建议和评论编辑了我的规则。谢谢你的时间,我刚刚在我自己的数据库上运行了一个测试,规则做了我希望他们做的事情。我不确定你的设置中发生了什么,这就是为什么我分享了我做的整个测试。谢谢你,先生,现在效果更好了。我更了解它的工作方式,它真的很有用。