在尝试同时在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
的全部目的是为了让其他孩子不会被覆盖。
感谢任何帮助。谢谢!
答案 0 :(得分:1)
目前,您正在使用以下对象更新对象:
let childUpdates = ["/users/\(userID!)": driver,
"/status/\(userID!)/driverInfo/vehicle": vehicle]
您将对象(字典)作为childUpdates
字典的值。这样做是用这个对象替换所有孩子意味着删除你发送的值为nil,例如你没有包括info
或infoThat
。
现在,如果您只想更改要提供的值,只需更改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)