如何从 Swift 5 上的 firebase 实时数据库检索子数据

How to retrieve child data from firebase realtime database on Swift 5

我遇到了 2 天的 firebase 问题,无法处理。

这是我的实时数据库

我正在获取内容、发布日期、来源等,但没有标签。

我想获得标签子项的“0:100”值。这是我的代码:

你能帮帮我吗?

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()
 }
})

我认为这是因为你正在转换字典,所以它的值只是字符串:if let valueDictionary = snapshot.value as? [AnyHashable:String] 所以没有字符串的键值对作为它的值在转换中丢失了。

相反,将 snapshot.value 转换为 [String: Any],然后像这样获取标签:let tags: Int = valueDictionary[“tags”] ?? 0.

假设您有多个这样的 post

posts
   0
      tags
         0: 100
         1: 200
   1
      tags
         0: 100
         1: 200

下面是将遍历每个 post 的代码,一次一个,读取内容,然后读取标签并将它们输出到控制台。

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 将在该节点上留下观察者并通知您进一步添加。