Swift 3“updateChildValues”方法失败:对象中的密钥无效。密钥必须非空,不能包含'。' '#''$''['或']''

时间:2017-07-11 15:05:12

标签: ios firebase swift3 firebase-realtime-database

我正在尝试使用电子邮件更新Firebase数据库作为值。 但是Swift 3“updateChildValues”方法失败并出现错误:... | select name,samaccountname,ipphone,@{Label='Username';Expression={"DOMAINNAME\$($_.SamAccountName)"}} 代码是:

Invalid key in object. Keys must be non-empty and cannot contain '.' '#' '$' '[' or ']''

可能由于电子邮件中的点数而失败。另一方面,将其编码到Base64并没有解决它。 同时使用“setValue”方法起作用:

    let key = emailQueueRef.childByAutoId()
    if user.email != nil {
        inviteUpdate["\(key)"] = user.email!
    }
    emailQueueRef.updateChildValues(inviteUpdate)

但是这种方法对我来说并不是很好,因为我同时使用了几条路径。 我在Firebase指南和文档中没有找到任何关于该案例的内容 它是Firebase的错误,还是我误解了什么?

2 个答案:

答案 0 :(得分:3)

问题是inviteUpdate字符串。

该字符串包含非法字符,但不是句点。造成这个问题。这是[“(键)”]部分。

var 密钥是Firebase DatabaseReference

您尝试写入Firebase的密钥如下所示

["https://your_app.firebaseio.com/email_node/-KorK9Io5Y2XejgLInvj": "dude@someemail.com"]

从问题中不清楚实际的Firebase结构应该是什么,但我认为你想要的是这个

let key = emailQueueRef.childByAutoId()
if user.email != nil {
    inviteUpdate[key.key] = user.email!  //note key.key
}

emailQueueRef.updateChildValues(inviteUpdate)

然后将其写入Firebase

"-KorOLfUa9HvgDIcpIyg": "dude@thing.com"

我将敦促您不要使用电子邮件地址作为密钥,因为它可能导致以后的大量工作。

例如,如果用户更改了其电子邮件地址。然后,您需要完全删除将其用作密钥的用户节点,然后重新编写它。同时,其他任何引用该密钥的地方也必须进行更改。

将电子邮件作为子节点包含在内通常要好得多

uid_0
  email: "dude@someemail.com"

然后其他区域可以简单地引用uid_0。

答案 1 :(得分:1)

经过一番尝试后,我发现了我的主要错误。我得到DatabaseReference childByAutoId(),我错过了指南中的另一个步骤,以获取密钥本身。 生成的代码是:

    let keyRef = emailQueueRef.childByAutoId()
    let key = keyRef.key
    if user.email != nil {
        inviteUpdate[key] = user.email!
    }
    emailQueueRef.updateChildValues(inviteUpdate)

最后有帮助。