【问题标题】:Firebase overwriting entriesFirebase 覆盖条目
【发布时间】:2016-07-13 21:55:30
【问题描述】:

我是 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 条目,键为“test”,值为“文本”

然后我杀死应用程序并将其更改为:

@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,非常感谢任何帮助!

【问题讨论】:

    标签: ios database swift firebase


    【解决方案1】:

    这里发生的情况是,您正在将 整个分支 (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,它会自动为你创建子密钥,还有更多,并且更容易管理和编码。

    Documentation Here

    编辑:建议参考下面弗兰克的更好答案。

    【讨论】:

    • 哦,我明白你的意思了。 childByAutoId 早些时候给我带来了麻烦,但我会再试一试并玩弄它。谢谢!
    • 只是在这里添加,感谢您提供 AutoId 提示。它工作得非常好,而且肯定更容易管理。再次感谢
    【解决方案2】:

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

    let data = ["CHANGED": String(text)]
    dataRef.updateChildValues(data)
    

    setValue() 用新值替换当前数据,updateChildValues() 就地更新它。

    请参阅Firebase documentation on updating saved data

    【讨论】:

    • 两者都有自己的用例。当您更新单个属性时,我通常使用serValue(),因为它不需要字典。当更新多个属性(但仍然是对象的子集)时,updateChildValue() 是您唯一的最佳选择。 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 2018-12-21
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2015-02-08
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多