Firebase会覆盖现有记录

时间:2016-03-03 17:15:40

标签: ios swift firebase

使用以下代码在Firebase BaaS中创建新用户,但在启动时会覆盖现有用户。

  let test = Firebase(url: "https://dr-freud.firebaseio.com/users")

     ref.createUser(email.text, password: password.text,
        withValueCompletionBlock: { error, result in
            if error != nil {
                print(error)

             } else {

                let uid = result["uid"] as? String

                let nome = self.nome.text!
                let cognome = self.cognome.text!

                let utente = ["Nome": nome, "Cognome": cognome]

                let users = ["\(self.nome.text!)": utente]

                test.setValue(users)

            }
    })

2 个答案:

答案 0 :(得分:2)

您在同一位置呼叫setValue(),因此您确实会覆盖该位置的现有数据。

为防止这种情况发生,您需要在特定于用户的位置呼叫setValue()

let currentUser = test.childByAppendingPath(uid)
currentUser.setValue(users)

通过调用childByAppendingPath(),我们最终会引用一个特定于此用户的数据库位置。

Firebase's programming guide for iOS涵盖了这一点以及更多内容。我高度建议您在该指南中花一些时间。几个小时后,你可以省下很多问题和疑问。

答案 1 :(得分:2)

由于这条线而被覆盖

test.setValue(users)

您需要为您写入用户节点的每个用户创建一个单独的子级。

由于这是用户节点,因此您应该使用createUser提供的uid。弗兰克的答案是正确的,所以下面更多的是一般案例答案。

如果是某个其他节点没有提供自然键,使用autoId将帮助您完成此操作;这是一个例子。

let pizzaRef = ref.childByAppendingPath("pizzas")
let thisPizzaRef = pizzaRef.childByAutoId()
let pizzaData = ["crustType": "Thick"]
thisPizzaRef.setValue(pizzaData)

这将在每次调用用户节点时创建一个新节点

pizzas
  -J1092uf8n0293i
     crustType: "Thick"
  -J989jijsoissds
     crustType: "Thick"