我是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)
}
使用“test”键和“text”值
附加到user-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 = ["CHANGED": String(text)]
dataRef.setValue(data)
}
它推得很好,但之前的条目刚被删除,唯一的条目就是这个。
我想要做的是逐步增加(可能有一个数字键?)逐个添加项目而不删除其他条目。
我希望这是有道理的:P和任何帮助都非常感谢!
答案 0 :(得分:4)
这里发生的是,您将整个分支(Users / UserID ##)设置为一个值,该值是单个节点Changed:<somestring>
从概念上讲,将您想要设置的密钥视为只是另一个分支可能会有所帮助,例如(Users / UserID ## / TaskID ##)
从概念上讲,不要像这样接近它:
Users/UserID = Key:Value
这样接近:
Users/UserID/Key = Value
注意:在为其分配值之前,分支Users/UserID/Key
不一定存在。
例如,您可以更改对要添加或更改的子项的引用:
let dataRef = root.childByAppendingPath(uid as! String + "/Task001")
dataref.setValue(String(text))
我同意你正在做的是开始学习Firebase的好方法,以及它是如何工作的。但是一旦你开始,而不是为你的子任务列表生成和使用自己的密钥,请查看childByAutoId
,它会自动为你创建子项,还有更多,并且更容易管理和编码
编辑:建议在下面提到弗兰克的更好答案。
答案 1 :(得分:4)
@ MtlDev的答案替代方法是使用updateChildValues()
:
let data = ["CHANGED": String(text)]
dataRef.updateChildValues(data)
虽然setValue()
会使用新值替换当前数据,但updateChildValues()
会对其进行更新。