【问题标题】:Swift 3 "updateChildValues" method fails with: Invalid key in object. Keys must be non-empty and cannot contain '.' '#' '$' '[' or ']''Swift 3“updateChildValues”方法失败:对象中的键无效。键必须非空且不能包含“.” '#' '$' '[' 或 ']''
【发布时间】:2017-12-15 17:38:44
【问题描述】:

我正在尝试使用电子邮件作为值来更新 Firebase 数据库。 但是 Swift 3 "updateChildValues" 方法失败并出现错误:Invalid key in object. Keys must be non-empty and cannot contain '.' '#' '$' '[' or ']'' 代码是:

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

可能是因为电子邮件中的点而失败。另一方面,将其编码为 Base64 并不能修复它。 同时使用“setValue”方法有效:

    emailQueueRef.childByAutoId().setValue(user.email!)

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

【问题讨论】:

  • 使用字符串值更改了电子邮件:“dummy”。无论如何它都没有奏效。只有当使用“key”作为参考时,它才有效。但这与 firebase 指南和文档相矛盾。我认为这是一个错误。
  • 不是。您使用电子邮件地址作为字典中的键,它成为数据库中的键。并且键不能包含. 字符。请参阅下面的更新答案和 cmets。

标签: ios firebase swift3 firebase-realtime-database


【解决方案1】:

经过一番尝试,我发现了我的主要错误。我得到了DatabaseReferencechildByAutoId(),我只是错过了指南中的一个额外步骤,即获取密钥本身。 结果代码是:

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

终于有帮助了。

【讨论】:

    【解决方案2】:

    问题在于邀请更新字符串。

    字符串包含非法字符,但不是句点。导致问题。它是 ["(key)"] 部分。

    var key 是 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多