我有这样的数据结构:
karmadots/events =
{
"event1": {
"categories" : ["fun"],
"name": "Some Title"
}
}
我希望能够附加到类别并使其具有[“fun”,“outside”]。我怎样才能做到这一点?当我更新事件路径上的子值时,整个类别路径将被重置。
编辑:
@IBAction func acceptUser(sender: AnyObject) {
// eventRef = karmadots/events (above)
var myRef = eventRef.childByAppendingPath("event1")
var eventDataOne = [
"categories":["fun"]
]
myRef.updateChildValues(eventDataOne)
// categories = ["fun"]
var eventDataTwo = [
//I want to be able to append to categories instead of overwriting
"categories":["outside"]
]
myRef.updateChildValues(eventDataTwo)
// categories = ["outside"] BUT I want it to be ["fun", "outside"]
}
我希望能够在第二次通话时附加到类别。
答案 0 :(得分:2)
更新不是一个深度递归的合并。请查看API文档中的更新信息:
这将仅覆盖"值"中列举的子项。参数 而且会让别人不受影响。请注意,更新功能是 相当于在命名子项上调用set();它不是 如果它们是对象,则递归更新子项。传递null作为 一个孩子的价值相当于在那个孩子身上调用remove()。
因此,要更新"您的类别,您需要直接在这些类别上运行更新,而不是父级:
var myRef = eventRef.childByAppendingPath("event1/categories");
myRef.updateChildValues({"one": 1});
myRef.updateChildValues({"two": 2});
如前所述,您无法使用数组索引完成此类活动。我们如何知道我们实际上是哪个项目"更新"?如果另一个用户在数组中添加或删除了一个项目,那么所有流体,顺序键都已更改,我的更新现在变得不稳定且不可预测(请参阅上面评论中的链接)。
相反,你可能想要做的是利用childByAutoId
。保存数据的指南中对此进行了介绍。有一个entire section dedicated to saving lists涵盖了您在这里遇到的所有陷阱以及正确的解决方案。
答案 1 :(得分:0)
您可能正在使用firebase函数$set
,它用新数据替换该节点上的所有内容。请尝试使用$push
,这会将新数据附加到现有数据中。