Ios Swift 3“;updateChildValues“;方法失败,原因是:对象中的键无效。键必须为非空且不能包含'''#''$'';[';或';]'';

Ios Swift 3“;updateChildValues“;方法失败,原因是:对象中的键无效。键必须为非空且不能包含'''#''$'';[';或';]'';,ios,firebase,swift3,firebase-realtime-database,Ios,Firebase,Swift3,Firebase Realtime Database,我正在尝试使用电子邮件作为值更新Firebase数据库。 但Swift 3“updateChildValues”方法失败,出现错误:对象中的键无效。键必须为非空且不能包含“.”#“$”[”或“]” 代码是: let key = emailQueueRef.childByAutoId() if user.email != nil { inviteUpdate["\(key)"] = user.email! } emailQueueRef.update

我正在尝试使用电子邮件作为值更新Firebase数据库。 但Swift 3“updateChildValues”方法失败,出现错误:
对象中的键无效。键必须为非空且不能包含“.”#“$”[”或“]”
代码是:

    let key = emailQueueRef.childByAutoId()
    if user.email != nil {
        inviteUpdate["\(key)"] = user.email!
    }
    emailQueueRef.updateChildValues(inviteUpdate)
可能是因为电子邮件中的点而失败。另一方面,将其编码到Base64并不能修复它。 同时,使用“设置值”方法工作:

    emailQueueRef.childByAutoId().setValue(user.email!)
但这种方法对我来说并不太好,因为我同时使用了多条路径。 我在Firebase指南和文档中没有找到任何关于该案例的信息
是Firebase bug,还是我误解了什么?

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

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

终于有帮助了。

问题是inviteUpdate字符串

字符串包含非法字符,但不是句点。造成问题的原因。这是[关键]部分

var键是一个Firebase数据库引用

您试图写入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。

更改了字符串值为“dummy”的电子邮件。但无论如何,它都不起作用。只有当使用“键”作为参考时,它才起作用。但这与firebase指南和文档相矛盾。我想这是个虫子,不是。您正在使用电子邮件地址作为字典中的键,它将成为数据库中的键。和键不能包含
字符。请参阅下面我的更新答案和评论。