Swift Firebase 快照查询缺少孩子

Posted

技术标签:

【中文标题】Swift Firebase 快照查询缺少孩子【英文标题】:Swift Firebase Snapshot query missing child 【发布时间】:2018-08-02 11:26:48 【问题描述】:

我将一些设置存储在 firebase 数据库中,并从 app.xml 访问这些设置。前 3 个设置运行良好,但是当我尝试添加一个新设置时,我无法达到此设置。

代码,我用什么:

    func getLanguage()
    ref = DatabaseRef.settingsRef
    //ref.observe(.value, with:  (snapshot) in
    ref.observeSingleEvent(of: .value, with:  (snapshot) in
        let valueL = snapshot.value as? NSDictionary
        if (valueL?.count)! > 0 
            self.lang = ((valueL!["lang"])! as? String)!
        
     )

DatabaseRef 是一个存储所有引用的结构文件。设置参考:

static let settingsRef = Database.database().reference().child("events").child(event).child("settings")

当我运行这个方法时,我在 self.lang = ((valueL!["lang"])!as?String) 上得到了这个错误代码!

线程 1:致命错误:在展开可选值时意外发现 nil

当然,我仔细检查了我的数据库结构和路径,但我无法找出问题所在,因为我的设置数据库如下所示:

     "settings" : 
         "contLog" : "true",
         "lang" : "en",
         "showStat" : "true",
         "useGate" : "true"
  ,

快照看起来像这样:

PS:我知道“true”不是布尔值,它只是用于字符串测试。

【问题讨论】:

从截图中很清楚为什么会发生错误:截图中没有lang属性。但是,您共享的代码不清楚为什么没有 lang 属性。我会做三件事:1)使用常规的observe 而不是observeSingleEvent,2)在转换之前检查属性是否存在(if snapshot.hasChild("lang")),3)记录值。如果这显示正确的结果,则问题可能与缓存有关。 @FrankvanPuffelen:是的,我的问题是你所说的,快照中没有 lang 但它应该是。我会试试你的建议。 @FrankvanPuffelen:我试过了。 1、改为ref.observe(.value, with: (snapshot) in。 2、if snapshot.hasChild("lang") 已添加。 3、print(self.lang)else print("no lang") 添加。结果:控制台中出现“no lang”。 嗯...我不知道为什么会这样。据我所知,代码看起来不错。您有多确定 settingsRef 指向的位置具有在线 lang 属性? 这里在黑暗中拍摄,但您的参考路径可能不是您认为的那样。在 firebase 调用之前尝试 print(ref) 并查看它指向的位置 - 它可能是 event 不正确并指向不包含 lang 子项的路径. 【参考方案1】:

感谢您的回答,这是缓存问题。 当我从手机(和模拟器)中删除应用程序并重建它时,一切正常。 ios 以某种方式存储了较旧的快照..

【讨论】:

以上是关于Swift Firebase 快照查询缺少孩子的主要内容,如果未能解决你的问题,请参考以下文章

如何将来自 Firebase 的查询快照转换为不同的对象?

Swift 和 Firebase 查询数据库

(Swift) 如果我的节点是自定义索引的,如何只查询当前用户的实时数据的快照?

Swift 3:当孩子存在时,FirebaseDB 返回 nil

Firebase:使用 swift3 访问快照子项

将 Firebase 快照投射到 Swift 3 对象