【问题标题】:Swift: Firebase updateChildValues function Overwriting and Deleting Other Keys at LocationSwift:Firebase updateChildValues 函数在位置覆盖和删除其他键
【发布时间】:2018-03-09 13:45:05
【问题描述】:

我在尝试同时更新 Firebase 中不同 JSON 分支的值时遇到了一个特殊问题。文档中提供的方法非常适合创建新数据,

 let key = ref.child("posts").childByAutoId().key
 let post = ["uid": userID,
             "author": username,
             "title": title,
             "body": body]
 let childUpdates = ["/posts/\(key)": post,
                "/user-posts/\(userID)/\(key)/": post]
 ref.updateChildValues(childUpdates)

但是当我尝试在多个位置更新数据时,它会覆盖其他键,就好像我在使用 setValue 一样。这是我的代码。

 let userID = Auth.auth().currentUser?.uid
    userRef = Database.database().reference()

   let vehicle = ["make":make.text,
                   "model": model.text,
                   "year":year.text,
                   "color":color.text,
                   "doors":doors.text]
    let driver = ["currentEvent":eventID]
    let childUpdates = ["/users/\(userID!)": driver,
                        "/status/\(userID!)/driverInfo/vehicle": vehicle]
    userRef.updateChildValues(childUpdates)

我还附上了一张图片,显示了执行该功能时哪些数据被删除了,哪些数据没有被删除。

我相信我正在尝试做的事情是可能的,据我所知,updateChildValues 的全部目的是为了不覆盖其他孩子。

感谢任何帮助。谢谢!

【问题讨论】:

    标签: json swift firebase firebase-realtime-database


    【解决方案1】:

    目前您正在使用这样的对象更新对象:

    let childUpdates = ["/users/\(userID!)": driver,
                            "/status/\(userID!)/driverInfo/vehicle": vehicle]
    

    您将对象(字典)作为childUpdates 字典的值。这样做是用这个对象替换所有孩子,这意味着删除您发送 nil 的值,例如在您的情况下,您没有包含 infoinfoThat

    现在,如果您只想更改您想要提供的值,例如仅更改 vehiclemakemodel 的值以及 drivercurrentEvent 的值,您必须提供特定路径对于这些值

    ["/users/\(userID!)/currentEvent": eventID,
                            "/status/\(userID!)/driverInfo/vehicle/make": make.text, "/status/\(userID!)/driverInfo/vehicle/model": model.text]
    

    我认为这将按照您的预期更新这些位置的值。

    HTH...

    【讨论】:

    • 谢谢!在我看来,Firebase 应该允许在多个位置进行选择性更新(如名称所示),或者只是将名称从 updateChildValues 更改,因为目前它更像 setValue
    • 是的,我同意,这有点令人困惑,我必须阅读文档才能理解行为。您可以在这里查看:firebase.com/docs/ios/guide/saving-data.html
    【解决方案2】:

    如果我弄错了,请纠正我,但如果我理解您的意图,这可能会产生更好的结果?

    let userID = Auth.auth().currentUser?.uid
        userRef = Database.database().reference()
    
       let vehicle = ["make":make.text,
                       "model": model.text,
                       "year":year.text,
                       "color":color.text,
                       "doors":doors.text]
        let driver = ["currentEvent":eventID]
        let childUpdates = ["/users/": userID!),
                            "/status/\(userID!)/driverInfo": vehicle]
        userRef.updateChildValues(childUpdates)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 2013-11-09
      • 2019-10-16
      相关资源
      最近更新 更多