Firebase将新密钥/值添加到预先存在的数据库,而不会导致xcode崩溃

时间:2017-12-13 05:44:14

标签: swift firebase firebase-realtime-database

`    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数据库。 然后我尝试在我的tableview中显示条目,并且我在unwrap返回nil时崩溃了。我知道为什么会发生这种情况,这是因为之前的数据没有我想要包含在节点中的新键/值。我尝试过很多不同的事情,比如让我们和后卫不要多赚钱。如何添加新的键/值,并且仍然具有没有新值的tableview读取条目?

我包含当前节点的图像,我想向节点添加“RatingsID”。当我这样做时,我得到了解开nil错误。

新密钥/值之前的数据库节点

enter image description here

1 个答案:

答案 0 :(得分:0)

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

所以改变

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

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

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

如果节点存在(不是零),您也可以将其编码为仅对该键的值进行操作

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

这里有一个完整的例子:我们正在从消息节点读取一些消息,其中一些消息有一个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)
}