Ios Firebase覆盖条目

Ios Firebase覆盖条目,ios,database,swift,firebase,Ios,Database,Swift,Firebase,我是Firebase的新手,不知道如何最好地解释这一点,但我会尝试 我正在尝试让我的应用程序为每个用户创建一个条目。然后,每个用户条目都有多个子条目(0到n),其中每个子条目都是一个简单的字符串。基本上有一个用户id(主条目),他们的任务是子条目 现在我的问题是,每当我将数据(子条目)推送到主条目时,所有以前的子条目都会被删除,而只推送最近的一个子条目。我一直在浏览文档,疯狂地用谷歌搜索,但似乎什么都没用 我试过这个: @IBAction func testWrite(sender: AnyOb

我是Firebase的新手,不知道如何最好地解释这一点,但我会尝试

我正在尝试让我的应用程序为每个用户创建一个条目。然后,每个用户条目都有多个子条目(0到n),其中每个子条目都是一个简单的字符串。基本上有一个用户id(主条目),他们的任务是子条目

现在我的问题是,每当我将数据(子条目)推送到主条目时,所有以前的子条目都会被删除,而只推送最近的一个子条目。我一直在浏览文档,疯狂地用谷歌搜索,但似乎什么都没用

我试过这个:

@IBAction func testWrite(sender: AnyObject) {
    let def = NSUserDefaults.standardUserDefaults()
    let uid = def.valueForKey("uid")
    let root = Firebase(url: getFirebaseURL())

    let text = self.tempText.text!
    let dataRef = root.childByAppendingPath(uid as! String)
    let data = ["test": String(text)]
    dataRef.setValue(data)
}
它附加到用户id条目fine,键为“test”,值为“text”

然后我关闭应用程序并将其更改为:

@IBAction func testWrite(sender: AnyObject) {
    let def = NSUserDefaults.standardUserDefaults()
    let uid = def.valueForKey("uid")
    let root = Firebase(url: getFirebaseURL())

    let text = self.tempText.text!
    let dataRef = root.childByAppendingPath(uid as! String)
    let data = ["CHANGED": String(text)]
    dataRef.setValue(data)
}
它推得很好,但是之前的条目刚刚被删除,剩下的唯一条目就是这个

我试图做的是,在不删除其他条目的情况下,一个一个地添加项目(可能有一个编号的键?)


我希望这是有意义的:p和任何帮助是非常感谢的

这里发生的是,您正在将整个分支(Users/UserID###)设置为一个值,该值是一个节点
更改:

从概念上讲,将要设置的键看作是另一个分支可能会有所帮助,例如(Users/UserID####/TaskID##)

因此,从概念上讲,不要这样对待它:
Users/UserID=Key:Value

这样处理:
Users/UserID/Key=Value

注意:分支
Users/UserID/Key
在赋值之前不必存在


e、 g您可以将引用更改为指向要添加或更改的子项:

let dataRef = root.childByAppendingPath(uid as! String + "/Task001")
dataref.setValue(String(text))

我同意您所做的是开始学习Firebase及其工作原理的一个好方法。但是,一旦开始,不要为子任务列表生成并使用自己的键,而是查看
childByAutoId
,它将自动为您创建子键,以及更多子键,并且更易于管理和编码


编辑:建议参考下面Frank的更好答案。

替代@MtlDev答案的方法是使用
updateChildValues()

setValue()
用新值替换当前数据时,
updateChildValues()
将其就地更新


看吧。

哦,我明白你的意思了。childByAutoId早些时候给我带来了麻烦,但我会再尝试一下,然后玩玩它。谢谢在此补充,谢谢你的自动识别提示。它工作得非常好,当然也更容易管理。再次感谢,他们都有自己的用例。在更新单个属性时,我通常使用
serValue()
,因为它不需要字典。更新多个属性(但仍然是对象的子集)时,
updateChildValue()
是您唯一的最佳选择。:-)
let data = ["CHANGED": String(text)]
dataRef.updateChildValues(data)