如何在Firebase中附加包含其他对象的路径?

时间:2015-02-16 08:04:30

标签: ios swift 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"]
}

我希望能够在第二次通话时附加到类别。

2 个答案:

答案 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,这会将新数据附加到现有数据中。

相关问题