`    let query = ref?.child("Reviews").queryOrdered(byChild: "UserID").queryEqual(toValue: myUser.userId)
        query?.observeSingleEvent(of: .value) { snapshot in
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let dict = snap.value as! [String: Any]
                let uid = dict["UserID"] as! String
                let review = dict["Body"] as! String
                let rating = dict["Rating"] as! String
                let titleID = dict["TitleID"] as! String
                let reviewID = dict["ReviewID"] as! String

                let ratingID = dict["RatingID"] as! String
                `


对数据库的ratingID调用发生错误。它解开了零。

我正在尝试使用新的键/值来修改现有的Firebase数据库。
然后,我尝试在表视图中显示条目,并且由于返回nil的包装而崩溃。我知道为什么会这样,这是因为先前的数据没有新的键/值,我想将其包含在以后的节点中。我尝试了很多不同的事情,例如让和让走而没有太多的财富。如何添加新键/值,并且仍然让tableview读取不具有新值的条目?

我包括当前节点的图像,并且想向该节点添加“ RatingsID”。当我这样做时,我得到了unnwrap nil错误。

新键/值之前的数据库节点

swift - Firebase在不崩溃xcode的情况下向现有数据库添加新的键/值-LMLPHP

最佳答案

您的代码非常接近,只需要保护代码,以防不存在ratingID密钥。

所以改变

let ratingID = dict["RatingID"] as! String




let ratingID = dict["RatingID"] as! String ?? ""


因此,如果RatingID节点不存在,则可以将ratingID设置为空字符串(或所需的任何字符串)

您也可以将其编码为仅在该节点存在时对键的值进行操作(不为nil)

if let someVal = dict["xxx"] {
    //do something with someVal
} else {
    print("xxx node wasn't found")
}


这是一个完整的示例:我们正在从message节点读取一些消息,其中一些具有test_key节点,而另一些则没有。对于那些没有,默认字符串被分配来测试

let postsRef = self.ref.child("messages")
postsRef.observe(.childAdded) { snapshot in
    let dict = snapshot.value as! [String: Any]
    let msg = dict["msg"] as! String
    let test = dict["test_key"] ?? "default string"
    print(msg, test)
}

10-04 22:06
查看更多