我希望以原子方式更新我的firebase数据库,因此我一直在使用updateChildValues。但是,我遇到了一些我想要解释的行为。
当我使用以下代码将数据添加到数据库时,它可以很好地工作,并且新对象将添加到JON树下,在ItemOwnership或ItemCategory节点下面新生成的键下:
let key = rootRef.child("PostedItems").childByAutoId().key
let updateLocations = ["ItemOwnership/\(key)" : uid,
"ItemCategory/\(key)" : category
]
rootRef.updateChildValues(updateLocations)
print("Item has been saved!")
但是,如果我使用常量来保存字典,就像这样:
let key = rootRef.child("PostedItems").childByAutoId().key
let itemOwnership = [key : uid]
let itemLocation = [key : location]
let updateLocations = ["ItemOwnership" : itemOwnership,
"ItemCategory" : itemLocation
]
rootRef.updateChildValues(updateLocations)
print("Item has been saved!")
新ID和值不会在新的自动生成ID下添加新值,而是覆盖旧ID和值,这样我就永远不会在ItemOwnership或ItemCategory节点下拥有多个键值对。为什么会这样?感谢
答案 0 :(得分:1)
这是设计工作。当你执行updateChildValues()时,它实际上是在幕后执行此操作:
for (key, val) in updateData {
ref.child( key ).set( val );
}
因此,您需要将最低级别节点作为键传递,以便仅替换该节点。