使用以下代码在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)
}
})
答案 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"