Swift Firebase 读取孩子的孩子

Posted

技术标签:

【中文标题】Swift Firebase 读取孩子的孩子【英文标题】:Swift Firebase read children of a child 【发布时间】:2017-09-29 10:36:03 【问题描述】:

所以我试图阅读下面“食谱”下的 autoID 孩子的孩子是我的 Firebase 数据库的图片,下面是应该检索“描述”和“名称”的值并插入的方法将它们转化为变量。

我目前在运行应用程序时遇到的错误是:

Could not cast value of type '__NSCFString' (0x10ad2afb8) to 'NSDictionary' (0x10ad2bfa8).

    ref = Database.database().reference()

    databaseHandle = ref?.child("Recipes").observe(.childAdded)  (snapshot) in

        for snap in snapshot.children
        
            let recipeSnap = snap as! DataSnapshot
            let recipeID = recipeSnap.key
            let dict = recipeSnap.value as! [String:AnyObject]
            let recipeName = dict["Name"] as! String
            let recipeDescription = dict["Description"] as! String
            print("key = \(recipeID) and name = \(recipeName) and description = \(recipeDescription)")
        
  

打印语句只是用于测试。

【问题讨论】:

***.com/a/45369544/7715250 也许这会有所帮助 【参考方案1】:

尝试以下方法,让我知道它现在是否有效:

// SEARCHES FOR SHARING CODE IN DATABASE (ONLINE)
let parentRef = Database.database().reference().child("Recipes")

parentRef.observeSingleEvent(of: .value, with:  snapshot in

    // SHOWING WHATEVER WAS RECEIVED FROM THE SERVER JUST AS A CONFIRMATION. FEEL FREE TO DELETE THIS LINE.
    print(snapshot)

    // PROCESSES VALUES RECEIVED FROM SERVER
    if ( snapshot.value is NSNull ) 

       // DATA WAS NOT FOUND
       print("– – – Data was not found – – –")

     else 

        // DATA WAS FOUND
        for user_child in (snapshot.children) 

            let user_snap = user_child as! DataSnapshot
            let dict = user_snap.value as! [String: String?]

            // DEFINE VARIABLES FOR LABELS
            let recipeName = dict["Name"] as? String
            let recipeDescription = dict["Description"] as? String
            print("– – – Data for the recipe \(recipeName) with the description \(recipeDescription) was found successfully! – – –")
        
    

如果您只想检索一个特定配方的名称和描述,则应将第三行更改为

parentRef.queryEqual(toValue:DefineWhatToSearchForHere).observeSingleEvent(of: .value, with:  snapshot in

如果您想要不断更新以反映更改,您可以使用计时器每隔 x 秒调用一次此函数并将其添加到 override func viewDidLoad(),例如

time = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(ViewController.updateFBData), userInfo: nil, repeats: true)

在创建一个名为 func updateFBData() 的函数后,您可以在其中做任何您想做的事情来获取新数据(见上文)并在定义的 timeInterval 中调用它

或者你可以做 Attila Hegedüs in this excellent tutorial.

【讨论】:

嘿!感谢您的回答,除了我想将实际值存储在 recipeName 和 recipeDescription 中,而不是字典中之外,它有点工作,你能帮我解决这个问题并编辑答案吗?另外你为什么把它改成observeSingleEvent?这意味着什么?每当我在数据库中插入内容时,它会不会不断监听并更新应用程序? 我刚刚编辑了您的答案,这对我有用,它准确地显示了我想要的内容,实际名称和描述,我做得对还是有更好的方法? @random1234 很好,很高兴它现在对你有用——你是对的,as? String 提供了你想要的格式的输出,我只是忘了添加它。 :) Awesome =) 只剩下一个问题,但是我希望它不断观察,而不是观察SingleEvent,我希望每当我添加或删除菜谱时,我的菜谱表视图都会更新。 我不能简单地将其更改为“观察”,它会实时更新吗?当我现在更改它时,它会将所有 firebase 项目再次添加到 tableView,即使它们仍然存在。是不是有什么我可以改变的,所以它只添加我刚刚添加的项目而不是旧的项目

以上是关于Swift Firebase 读取孩子的孩子的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3:当孩子存在时,FirebaseDB 返回 nil

Firebase - 下载特定的孩子(Swift 3)

如何从 Firebase (Swift) 中删除一个孩子

在嵌套的孩子内部迭代。 Firebase 和 Swift 3

检索孩子的名字 Firebase 数据库 Swift

Swift Firebase 快照查询缺少孩子