【问题标题】:SetValue is not behaving as expectedSetValue 的行为不符合预期
【发布时间】:2017-01-27 16:16:00
【问题描述】:

我在使用 Swift 编写的 iOS 应用中使用 Firebase。

    static func createUserRecord(uid: String, user: User){
       let userDictionary = user.getJSON()
       self.usersRef.child(uid).setValue(userDictionary)
    }

此代码在我发布我的应用程序之前运行良好,在发布应用程序后我无法再添加用户记录,该应用程序的所有其他功能都运行良好,包括保存和检索一些数据。谁能发现这段代码中的错误?

即使路径不存在,setValue 是否也有效?例如如果路径a/b/ 在那里,我打电话给a/b/c.child('d').setValue("abcd")。这行得通吗?

【问题讨论】:

  • 您的 Firebase 安全规则是否设置为允许保存这些数据?
  • 调用setValue() 将创建路径,如果它还不存在的话。根据数据库(或您的安全规则),您的 user.getJSON 似乎更有可能包含无效的内容。您需要附加一个完成块来检测这一点:firebase.google.com/docs/reference/ios/firebasedatabase/…
  • @chickenparm 是的,它们都适用于读写,我在将图片上传到存储时遇到了另一个问题,(一个小时前它工作得很好)这可能是带宽问题吗?我应该考虑升级计划吗?
  • @FrankvanPuffelen 谢谢,getJSON 正在为某些用户返回一个键的字符串值,而它预计是布尔值,刚刚修复它现在可以工作,谢谢,你可以考虑添加您的评论作为答案。
  • 我实际上花了最后 20 分钟写一个 SO 文档部分,以备下次有人遇到此问题时使用:stackoverflow.com/documentation/firebase/5548/… :-)

标签: ios swift firebase swift2 firebase-realtime-database


【解决方案1】:

调用setValue() 将创建路径,如果它还不存在的话。

您的user.getJSON() 似乎更有可能包含根据数据库(或您的安全规则)无效的内容。

你需要attach a completion block 来检测这个。

这是 StackOverflow 文档中的一个示例:

您的读取操作可能无法正常工作的一个常见原因是您的 安全规则拒绝该操作,例如因为您不是 经过身份验证(默认情况下,数据库只能由 经过身份验证的用户)。

您可以在控制台输出中看到这些违反安全规则的行为。但 很容易忽略这些。您也可以在自己的代码中处理它们 并使它们更显眼,这特别有用 在开发期间(因为您的 JSON、规则和代码经常更改)。

要在 iOS 上检测失败的读取,您必须实现 withCancel 你的观察者的块:

ref!.child("notAllowed").observe(.value, with: { (snapshot) in
    print("Got non-existing value: \(snapshot.key)")
}, withCancel: { (error) in
    print(error)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2021-04-09
    相关资源
    最近更新 更多