如何在Swift 5上从firebase实时数据库检索子数据
我面临firebase问题已经两天了,无法处理它 这是我的实时数据库 我得到的内容,出版日期,来源等,但标签 我想得到标签子项的“0:100”值。这是我的密码: 你能帮帮我吗如何在Swift 5上从firebase实时数据库检索子数据,swift,firebase,firebase-realtime-database,swift5,Swift,Firebase,Firebase Realtime Database,Swift5,我面临firebase问题已经两天了,无法处理它 这是我的实时数据库 我得到的内容,出版日期,来源等,但标签 我想得到标签子项的“0:100”值。这是我的密码: 你能帮帮我吗 databaseRef.child("posts").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in if let valueDictionary = snapshot.value as? [AnyHashable:String] {
databaseRef.child("posts").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in
if let valueDictionary = snapshot.value as? [AnyHashable:String] {
let newsTitle = valueDictionary["title"]
let newsImage = valueDictionary["imageUrl"]
let publishData = valueDictionary["publishData"]
let content = valueDictionary["content"]
let tags = valueDictionary["tags"]
self.news.insert(newsStruct(newsTitle: newsTitle, newsImage: newsImage, publishData: publishData, content: content, tags: tags), at: 0)
self.tableView.reloadData()
self.tableViewTagsNews.reloadData()
}
})
我认为这是因为您正在强制转换字典,所以它的值仅为字符串:
如果让valueDictionary=snapshot.value as?[AnyHashable:String]
因此,没有字符串作为其值的键值对在转换过程中丢失
相反,将snapshot.value转换为
[String:Any]
,然后获得如下标记:let tags:Int=valueDictionary[“tags”]??0
假设您有多篇这样的帖子
posts
0
tags
0: 100
1: 200
1
tags
0: 100
1: 200
下面的代码将遍历每篇文章,每次一篇,读取内容,然后读取标记并将它们输出到控制台
func readPostTags() {
let postsRef = self.ref.child("posts")
postsRef.observe(.childAdded, with: { snapshot in
let content = snapshot.childSnapshot(forPath: "creation_date").value as! String
let tagsSnap = snapshot.childSnapshot(forPath: "tags")
let allChildTagsSnap = tagsSnap.children.allObjects as! [DataSnapshot]
for tagChildSnap in allChildTagsSnap {
let key = tagChildSnap.key
let value = tagChildSnap.value as! Int
print(content, key, value)
}
})
}
以及输出
0 100
1 200
0 100
1 200
请记住,.childAdded将在该节点上留下一个观察者,并通知您进一步的添加。那么标签的数据类型是什么?会是一个范围吗?我知道了。0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0!我还有一个问题。如果我只是想得到第一个孩子呢?@Oguz如果我的答案回答了这个问题,请务必接受它,这样它可以帮助其他人。这里有一个关于的链接。你说的第一个孩子是什么?帖子的第一个子还是标签的第一个子还是其他什么?是的。标记的第一个子项。@Oguz有两个选项。如果您知道相关节点的特定路径,则可以直接访问它。因此,例如
让pathToTag=fbRef.child(“posts”).child(“0”).child(“tags”).child(“0”)
并使用.observeSingleEvent观察该节点,并从快照中获取值,在本例中为100。我不喜欢在注释中添加大量代码,因为它很难阅读,但这可能会让您继续。如果没有,请用您尝试过的代码单独问一个问题,我们会看一看!