我的数据库看起来像这样
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)
}
}
}