Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift 5上从firebase实时数据库检索子数据_Swift_Firebase_Firebase Realtime Database_Swift5 - Fatal编程技术网

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

如何在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] {

我面临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()
 }
})

我认为这是因为您正在强制转换字典,所以它的值仅为字符串:
如果让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。我不喜欢在注释中添加大量代码,因为它很难阅读,但这可能会让您继续。如果没有,请用您尝试过的代码单独问一个问题,我们会看一看!