Swift:Firebase updateChildValues函数覆盖和删除位置上的其他键

时间:2017-09-27 23:11:06

标签: json swift firebase firebase-realtime-database

在尝试同时在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)

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

Image revealing the data which is deleted

我相信我想做的事情是可能的,据我所知,updateChildValues的全部目的是为了让其他孩子不会被覆盖。

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

目前,您正在使用以下对象更新对象:

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

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

现在,如果您只想更改要提供的值,只需更改make的{​​{1}}和model以及vehicle currentEvent的值,你必须给这些值的特定路径

driver

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

... HTH

答案 1 :(得分:0)

如果我弄错了,请纠正我,但如果我明白你要做什么,这可能会产生更好的结果?

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)