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