Swift 无法检索子节点 Firebase 数据库



我的数据库看起来像这样

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 个时,我总共得到 3 x 3 个 url(每个项目一个(

替换

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

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

上面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)
}
}
}

最新更新