【问题标题】:Swift unable to retrieve child node firebase databaseSwift 无法检索子节点 firebase 数据库
【发布时间】:2020-04-22 00:27:22
【问题描述】:

我的数据库是这样的

category
   subCat1
      item1
         someData: somedata
         storage: storageref
      item2
         someData: somedata
         storage: storageref
      item3
         someData: somedata
         storage: storageref
   subCat2
      item1
         someData: somedata
         storage: storageref
      item2
         someData: somedata
         storage: storageref
      item3
         someData: somedata
         storage: storageref

我想检索特定子类别节点中“存储”键的值。我尝试使用以下代码进入一个特定的子类别并检索到存储密钥:

let ref = Database.database().reference().child("category").child("subCat1")
    ref.observeSingleEvent(of: .value) { (snapshot) in

        for item in snapshot.children {
            let snap = item as! DataSnapshot
            let imageSnap = snap.childSnapshot(forPath: "storage")
            let dict = imageSnap.value as! [String: Any]
            let url = dict["storage"] as! String
            print(url)
        }

此代码使应用程序在let dict = imageSnap.value as! [String: Any] 行崩溃,错误代码为Could not cast value of type '__NSCFString' (0x10632a168) to 'NSDictionary' (0x10632b1a8)

我尝试过打印快照、快照.child、快照.值等。这些都没有给我我想要的东西,它们要么不起作用,要么给我一个包含 subCat1、所有项目、someData 的大字典和存储。

更新:

在下面 Sh_Khan 的回答的帮助下,我可以打印节点中每个项目的存储字符串,但是我的 for in 循环导致所有字符串每次打印 3 次,所以我总共得到 3 x 3 个 url,当我只想要 3 个时(每个项目一个)

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    替换

    let dict = imageSnap.value as! [String: Any]
    let url = dict["storage"] as! String
    

    与

    if let url = imageSnap.value as? String { } 
    

    【讨论】:

    • 当我这样做时,下面的行 (let url = dict["storage"] as!String) 给出了错误“无法使用 'String' 类型的索引来下标 'String' 类型的值"
    • 太好了,它打印了我所有项目的存储密钥的值。但是,该应用程序也会在 let url 行崩溃并显示错误代码:“无法将 'NSNull' (0x110cb1770) 类型的值转换为 'NSString' (0x10fe210d0)。”
    • 很好,现在可以使用了。但是,对于我的 subCat 节点中的每个项目,所有 3 个存储字符串一次。所以它总共打印了 3 x 3 行相同的存储字符串。
    【解决方案2】:

    以上 Sh_Khan 的答案是正确的,只需尝试使用 if let 解开项目值,这样您就不会崩溃。您更新的代码如下:

        let ref = Database.database().reference().child("category").child("subCat1")
            ref.observeSingleEvent(of: .value) { (snapshot) in
    
                for item in snapshot.children {
                    if let snap = item as? DataSnapshot {
    
                     let imageSnap = snap.childSnapshot(forPath: "storage")
                     let url = imageSnap.value as? String
    
                     print(url)
    
                    }
                }
       }
    

    【讨论】:

    • 这行得通,但是它打印所有三个 url 的次数与我的 subCat1 节点中的项目数一样多。因此,由于我在此节点中有 3 个项目,它会打印 3 x 3 次 url。如何让每个网址只打印一次?
    • 都有唯一的存储 url,相同的 key:“storage”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多