【问题标题】:Firebase Add New Key/Value to Pre-existing database without crashing xcodeFirebase 将新的键/值添加到预先存在的数据库而不会使 xcode 崩溃
【发布时间】:2017-12-13 05:44:14
【问题描述】:
`    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 调用数据库时发生错误。它解开 nil。

我正在尝试使用新的键/值来调整现有的 Firebase 数据库。 然后,我尝试在我的 tableview 中显示条目,但我遇到了 unwrap 返回 nil 的崩溃。我知道为什么会发生这种情况,这是因为以前的数据没有我想要包含在节点中的新键/值。我尝试了许多不同的事情,例如 if let 和 guard let 没有太多财富。如何添加新的键/值并且仍然让 tableview 读取没有新值的条目?

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

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

【问题讨论】:

  • 我在网上的任何地方都找不到对此的参考!
  • 请包含您的代码,因为这就是问题所在,并指出错误发生在哪一行。请看How to create a Minimal, Complete, and Verifiable example
  • 好的,我刚刚添加了代码。我已经知道问题出在哪里,我的问题是如何在不使用新格式重新完成所有条目的情况下满足没有评级 ID 键值的旧条目。即,如果我愿意,我希望将来能够调整我的键值对,比如添加喜欢和关注到节点。

标签: swift firebase firebase-realtime-database


【解决方案1】:

您的代码非常接近,只需要保护代码以防 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")
}

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

【讨论】:

  • 嗯,当我尝试这样做时,我仍然会被解包为 nil 错误?? "" 方法
  • 问题可能是因为该特定条目上不存在 RatingID 值对?
  • 我通过更改 !至 ?作为之后
  • 这就是整个想法。如果 dict["RatingID"] 不存在,var ratingID 将被设置为一个空字符串 "",而如果它确实存在,无论值是什么都将分配给 var。
猜你喜欢
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多