Android Firebase写入权限被拒绝

Android Firebase写入权限被拒绝,android,firebase,firebase-realtime-database,firebase-security,Android,Firebase,Firebase Realtime Database,Firebase Security,我不明白为什么firebase不让我写这篇文章。我觉得我在模拟器中也做了同样的事情,它在那里工作。以下是我在本节中的安全规则 "joinRequests" : { "$clanid": { "$requesterid" : { ".read" : "$requesterid === auth.uid || root.child('clans/' + $clanid + '/members/' + auth.uid + '/admin').val() === true",

我不明白为什么firebase不让我写这篇文章。我觉得我在模拟器中也做了同样的事情,它在那里工作。以下是我在本节中的安全规则

"joinRequests" : {
  "$clanid": {
    "$requesterid" : {
      ".read" : "$requesterid === auth.uid || root.child('clans/' + $clanid + '/members/' + auth.uid + '/admin').val() === true",
      ".validate": "newData.hasChildren(['request'])",
      "request" : {
        ".write" : "true",
        ".validate": "newData.hasChildren(['name', 'message'])",
        "name" : {
        ".validate": "newData.isString()"
        },
        "message" : {
          ".validate": "newData.isString()"
        },
        "$other": {
        ".validate": false
        }
      },
      "approved" : {
        ".write" : "root.child('clans/' + $clanid + '/members/' + auth.uid + '/admin').val() === true || ($requesterid === auth.uid  && !newData.exists())",
        ".validate": "newData.isBoolean()"
      },
      "$other": {
      ".validate": false
      }
    }
  }
},
在我的android应用程序代码中,我运行以下两行:

dataSnapshot.child("request").getRef().removeValue();
dataSnapshot.child("approved").getRef().removeValue();
我觉得奇怪的是,它允许我删除“approved”值,而不是“request”值。dataSnapshot是一个$requesterid。如果我在模拟器中运行这一行,它允许写入:

/joinRequests/QV28VJYG/c1cef959-2dd3-4cab-8649-2b81892cffa6/request
我在android studio中遇到的错误如下:

W/RepoOperation: setValue at /joinRequests/QV28VJYG/qRlJt4UIAcRVIe9VXoYVBa68tO43/request failed: DatabaseError: Permission denied

我做的一定是傻事,但我无法想象会是什么。任何帮助都会很好,谢谢。

newData是一个快照,表示操作发生后数据的外观


newData.haschilds(['request'])
告诉firebase在执行操作后确保
request
节点存在。因此,禁止删除此节点。

在请求中没有此验证规则的情况下,是否可以尝试此操作:“.validate”:“newData.hasChildren(['name','message'])”?因此,问题出在这一行。validate:“newData.hasChildren(['request'])”由于我的要求,我不能在$requesterid上写allow,所以我试图删除子项,而父项中的这个规则不允许这样做。奇怪的是模拟器没能捕捉到它。是的,看起来仿真器UI需要排序的行消息,当API返回未排序的行消息数组时,未能突出显示某些行。我会修好的。谢谢你的报道!