如何在 Firebase 中附加到带有其他对象的路径?
How to append to a path with additional objects in Firebase?
我有这样的数据结构:
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"]
}
我希望能够在第二次调用时附加到类别。
您可能正在使用 firebase 函数 $set
,它会用新数据替换该节点上的所有内容。尝试改用 $push
,这会将新数据附加到现有数据。
更新不是深度递归合并。从 API 文档中查看此简介以进行更新:
This will overwrite only children enumerated in the "value" parameter
and will leave others untouched. Note that the update function is
equivalent to calling set() on the named children; it does not
recursively update children if they are objects. Passing null as a
value for a child is equivalent to calling remove() on that child.
因此,对于 "update" 您的类别,您需要 运行 直接更新这些类别,而不是父类别:
var myRef = eventRef.childByAppendingPath("event1/categories");
myRef.updateChildValues({"one": 1});
myRef.updateChildValues({"two": 2});
如前所述,您将无法使用数组索引完成这种 activity。我们怎么知道我们实际上是哪一项 "updating"?如果另一个用户在数组中添加或删除一个项目,所有流畅的顺序键都会发生变化,我的更新现在不稳定且不可预测(请参阅我上面评论中的链接)。
相反,您可能想在这里做的是利用 childByAutoId
。这在保存数据指南中有所介绍。有一个 entire section dedicated to saving lists 涵盖了您在这里遇到的所有陷阱和正确的解决方案。
我有这样的数据结构:
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"]
}
我希望能够在第二次调用时附加到类别。
您可能正在使用 firebase 函数 $set
,它会用新数据替换该节点上的所有内容。尝试改用 $push
,这会将新数据附加到现有数据。
更新不是深度递归合并。从 API 文档中查看此简介以进行更新:
This will overwrite only children enumerated in the "value" parameter and will leave others untouched. Note that the update function is equivalent to calling set() on the named children; it does not recursively update children if they are objects. Passing null as a value for a child is equivalent to calling remove() on that child.
因此,对于 "update" 您的类别,您需要 运行 直接更新这些类别,而不是父类别:
var myRef = eventRef.childByAppendingPath("event1/categories");
myRef.updateChildValues({"one": 1});
myRef.updateChildValues({"two": 2});
如前所述,您将无法使用数组索引完成这种 activity。我们怎么知道我们实际上是哪一项 "updating"?如果另一个用户在数组中添加或删除一个项目,所有流畅的顺序键都会发生变化,我的更新现在不稳定且不可预测(请参阅我上面评论中的链接)。
相反,您可能想在这里做的是利用 childByAutoId
。这在保存数据指南中有所介绍。有一个 entire section dedicated to saving lists 涵盖了您在这里遇到的所有陷阱和正确的解决方案。