我目前有一个正在运行的函数,当添加到表视图中时,它将新的GoalItem插入我的Firebase数据库中。

func save(_ goalItems: [GoalItem]) {
    let ref = Database.database().reference()
    let goalRef = ref.child("goals").childByAutoId()

    for goalItem in goalItems {
        let attributes = ["iconName": goalItem.iconName, "text": goalItem.text, "user": self.email]
        goalRef.setValue(attributes)
    }

}

但是,当用户编辑其“GoalItem”时,也会在其中调用save,从而导致该项目被复制。

本质上,当textGoalItem属性最初等于数据库的“文本”引用(它是“目标”引用的子代)时,我正在寻找一种避免条目重复的方法。

我猜是这样的:
if goalItem.text == (value of Firebase's text reference) {
   (update the text reference)
else {
      goalRef.setValue

访问数据库的“文本”引用以获取值并将其与goalItem.text进行比较是我目前遇到的问题。数据库的结构非常简单-下图。

数据库

ios - 避免在Firebase中重复输入-LMLPHP

TLDR;需要访问特定的数据库子级引用和更新(而不是覆盖)

先感谢您!

最佳答案

注意您的保存功能中的这一行:

let goalRef = ref.child("goals").childByAutoId()
childByAutoId()是生成包含您的目标对象的一长串随机字符的原因。由于您是在更新时调用它,因此它也在创建一个新的目标对象。

因此,您需要为每个现有目标保留此自动ID。而且,如果您要编辑特定的目标对象,则此引用应为:
// assuming you have a goal object that holds onto its ID
let goalRef = ref.child("goals").child(goal.id)

关于ios - 避免在Firebase中重复输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46935670/

10-10 18:32