使用 Codable 和 CodableFirebase 快速解析 Firebase 值时获取 nil

2024-04-15

我正在使用 Firebase 实时数据库,在 swift 和外部库 CodableFirebase 中使用可编码方法。我已经创建了模型结构,但是当我尝试使用模型结构解析值(因为我正在获取所有值)时,它给了我零。我的数据库有一些键,我可能无法在嵌套值中正确处理这些键。请帮忙。谢谢

附上数据库结构快照。

Code:

Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
            guard let value = snapshot.value as? [String: Any] else { return }
            do {

                let friendList = try FirebaseDecoder().decode(Response.self, from: value)

                guard let conversationUid = value["conversationUid"] as? String,
                let friendStatus = value["friendStatus"] as? String,
                let notify = value["notify"] as? Bool,
                let phNumber = value["phoneNumber"] as? String,
                let uid = value["uid"] as? String
                else { return }


            } catch let error {
                print(error)
            }
        })

JSON:

{
  "FTgzbZ9uWBTkiZK9kqLZaAIhEDv1" : {
    "friends" : {
      "zzV6DQSXUyUkPHgENDbEjXVBj2" : {
        "conversationUid" : "-L_w2yi8gh49GppDP3r5",
        "friendStatus" : "STATUS_ACCEPTED",
        "notify" : true,
        "phoneNumber" : "+9053",
        "uid" : "zzV6DQSXUyUkPHgEZ9EjXVBj2"
      }
    },
    "lastLocation" : {
      "batteryStatus" : 22,
      "latitude" : 48.90537,
      "longitude" : 28.042,
      "timeStamp" : 1556568633477,
      "uid" : "FTgzbZ9uWkiZK9kqLZaAIhEDv1"
    },
    "profile" : {
      "fcmToken" : "fp09-Y9ZAkQ:APA91bFgGBsyFx0rtrz7roxzpE_MmuSaMc4is-XIu7j718qjRVCSHY4PvbNjL1LZ-iytaeDKviIRMH",
      "name" : "Mt Bt",
      "phoneNumber" : "+90503",
      "uid" : "FTgzbZ9uWBTkiZLZaAIhEDv1"
    }
  }

Model:

struct Response : Codable {

    let friends : Friend?
    let lastLocation : LastLocation?
    let profile : Profile?
}

struct Friend: Codable {
    let converstionUid: String?
    let friendStatus: String?
    let notify: Bool?
    let phoneNumber: String?
    let uid: String?

}

struct Profile : Codable {

    let fcmToken : String?
    let name : String?
    let phoneNumber : String?
    let uid : String?
}

struct LastLocation : Codable {

    let batteryStatus : Int?
    let latitude : Float?
    let longitude : Float?
    let timeStamp : Int?
    let uid : String?
}


您的代码正在读取整个users节点,然后尝试读取conversationUid以及该节点的其他属性。由于这些属性不存在直接位于users node,你得到空值。

要正确解析此 JSON,您需要先导航三个级别的子节点,然后再尝试读取命名属性,例如conversationUid.

Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
  for userSnapshot in snapshot.children.allObjects as! [DataSnapshot] {
    let friendsSnapshot = userSnapshot.childSnapshot(forPath: "friends")
    for friendSnapshot in friendsSnapshot.children.allObjects as! [DataSnapshot] {

      guard let value = friendSnapshot.value as? [String: Any] else { return }
      do {
        guard let conversationUid = value["conversationUid"] as? String,
        ...

上面的代码首先循环遍历下的第一级子节点/users,然后循环遍历friends每个用户的节点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Codable 和 CodableFirebase 快速解析 Firebase 值时获取 nil 的相关文章

随机推荐

  • 如何使用键值编码判断对象是否存在键?

    我想测试iPhone SDK中的对象是否具有可写的 property 一种可能的方法是检查 valueForKey 方法 但这看起来相当不优雅 Example try id value instance valueForKey myProp
  • jQuery 选择器错误?组合选择器与简单选择器和 find()

    我的情况很尴尬 我有这样的事情 div div
  • CoreData 按属性划分的唯一对象

    我有一个图表 其中包含一种名为 消息 的对象 一条消息可以有子项 因此该图是一棵树 图上的每个对象都包含一个属性值 这是一种 UUID 全局唯一 因此存储不能包含具有相同 UUID 的多条消息 此 uuid 是从消息数据中获取的字符串 因此
  • 使用PBKDF2 java解密和加密

    有没有办法解密PBKDF2java中的密码 Java有实现PBKDF2算法为PBKDF2WithHmacSHA1 我得到了为密码创建哈希值的代码 我参考了下面的链接来了解哈希技术 http howtodoinjava com securit
  • Rails 5 - 找不到生成器“rspec:安装”

    在我的 Rails 5 0 0 应用程序中 我已将以下内容添加到我的 Gemfile 中 group development test do gem byebug platform mri gem rspec rails gt 3 5 gt
  • 使用 React 测试库提交后测试重定向

    我正在尝试测试登录组件 具体来说 它会在成功登录时重定向 手动测试时效果很好 但在我的测试中 它从不进行重定向 因此找不到 注销 链接 test successfully logs the in the user async gt cons
  • 使用 INDY 检测远程服务器上文件的 Mime 类型

    我一直在使用 Synapse 库从互联网下载文件 但我最近将我的应用程序转换为使用 INDY 并且我缺少 Synapse 库中更好的功能之一 即能够轻松获取我在将其保存到本地计算机之前从服务器下载的文件 INDY 是否具有此功能 如果有 我
  • Excel 中的数组常量

    我在单元格 A1 中定义了一个数组常量为 1 2 3 这显示为 1 数组中的第一个值 我想让公式 SUM A1 返回 6 但是 SUM 使用 A1 作为单单元数组 而不是 A1 中包含的数组常量 因此 SUM A1 返回 1 同样 我希望
  • 使用脚本更新 Google 电子表格数据透视表范围

    如何使用脚本编辑 Google 文档电子表格中数据透视表的数据范围 Or 是否可以对数据透视表范围使用命名范围 不幸的是 此时 2012 年 7 月 31 日 我相信答案是 你不能 和 不 我可以建议的唯一解决方法是 1 使用 QUERY
  • ORMLite 和惰性集合的问题

    我在我的 android 项目中使用 ormlite 我有两节课 DatabaseTable tableName usershows public class UserShow DatabaseField id true private I
  • 使用 c# 和 xaml 在 Metro 应用程序中显示 svg

    我正在使用 XAML 和 C 开发 Windows 8 Metro 应用程序 我有一个 SVG 图像的 Uri 它确实有效 但我不知道如何获取此图像并将其显示在 XAML 中 或者是否无法在 NET Core 中使用 SVG 一种方法是将
  • 尽管不再支持 TomCat,如何在 Plesk Onyx 17.8 中部署 .war 文件?

    Plesk Onyx 及之前版本 17 5 附带 Tomcat 安装 无需安装不再受支持 https support plesk com hc en us articles 115005115774从 17 8 版本开始 因此 不再可以部署
  • 如何在 Azure AD B2C 中启用电子邮件验证

    如何在 B2C 中使用自定义策略启用电子邮件验证 为了对其进行逆向工程 我尝试在内置策略中禁用它并下载该策略 我尝试将该元数据项添加到我自称的技术配置文件中 但这不起作用 逆向工程测试 内置策略
  • React-native-navigation:goBack() 不起作用

    我在 React Native 中使用 React Navigation 和 Redux 导航工作正常 但在一个屏幕上 goBack 函数不起作用 你能告诉我们为什么吗 这是标题配置 static navigationOptions hea
  • Doctrine_Core::getTable()->findAll() 如何指定顺序?

    当使用Doctrine Table对象 使用时是否可以指定返回集合的顺序findAll or findByWhatever In the doc s http www doctrine project org api orm 1 2 doc
  • 使用 Dependency Walker 分析 x86 可执行文件在 Windows 7 x64 上挂起

    在Windows 7下x64 当我尝试分析一个x86使用最新版本的 Dependency Walker 2 2 6000 可执行文件时 分析过程总是在某个点挂起 大多数时候最后加载的 DLL 是c windows syswow64 URLM
  • Apps 脚本正则表达式 - 不区分大小写

    我正在为 Google 文档编写应用程序脚本 我正在使用 findText 来查找指定字符串的实例 默认情况下 它区分大小写 我需要删除它 但我不知道如何将 i 添加到 re2 正则表达式 以便它在应用程序脚本引擎中工作 在我的示例中 我尝
  • 在列表视图中显示文件夹图标

    我已经设法使用 shell32 提取在列表视图中显示文件的图标 但是当对文件夹执行此操作时 图标似乎不显示 怎么会这样 这是我的 Shell 提取代码 declare the Win32 API function SHGetFileInfo
  • 加载实体而不将其绑定到视图

    在控制器中 Detail controller js 我想访问尚未绑定到控件的 OData 实体 如果输入0001 of my BananaSet绑定到视图 我可以通过访问原始数据 this getView getModel getProp
  • 使用 Codable 和 CodableFirebase 快速解析 Firebase 值时获取 nil

    我正在使用 Firebase 实时数据库 在 swift 和外部库 CodableFirebase 中使用可编码方法 我已经创建了模型结构 但是当我尝试使用模型结构解析值 因为我正在获取所有值 时 它给了我零 我的数据库有一些键 我可能无法