【发布时间】:2016-12-29 02:27:15
【问题描述】:
我希望能够检查一个电子邮件地址是否已被使用(所以如果有人输入 test1@test.com 但另一个用户已经使用该电子邮件帐户注册)。
我有一个简单的测试,如果它没有被使用,图像视图显示一个绿色箭头,如果它已经被使用,那么它是红色 x
当我创建用户时,我使用以下代码
FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: { (user, error) in
if error == nil {
self.ref.child("userEmails").child((user?.uid)!).setValue(email)
FIRAuth.auth()!.signIn(withEmail: email,
password: password)
} else {
//registration failure
}
我想要检查的是
func checkIfEmailExists(textField: UITextField) {
let ref = FIRDatabase.database().reference()
let email = firstContainerTextField.text ?? ""
ref.child("userEmails").queryEqual(toValue: email)
.observe(.value, with: { snapshot in
if (self.firstContainerTextField.text?.isEmpty)! {
self.firstContainerImage.image = UIImage.init(named: "emptyBlue.png")
} else if !(self.firstContainerTextField.text?.isEmpty)! && !snapshot.exists() {
self.firstContainerImage.image = UIImage.init(named: "redEx.png")
} else if snapshot.exists() {
self.firstContainerImage.image = UIImage.init(named: "greenCheck.png")
}
});
}
到目前为止,它不起作用,因为我可以在我的数据库中看到 test1@test.com 存在。 谁能告诉我我错过了什么?
编辑
我已经更新了我的代码。我正在使用 hasChildren,我搜索了类似的问题,他们似乎指向了这个方向,但我仍然无法得到我正在寻找的结果
func checkIfEmailExists(textField: UITextField) {
let ref = FIRDatabase.database().reference()
let email = firstContainerTextField.text ?? ""
ref.child("userEmails").queryEqual(toValue: email)
.observe(.value, with: { snapshot in
if !snapshot.hasChildren() {
self.firstContainerImage.image = UIImage.init(named: "redEx.png")
} else {
for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
let tmp = child.value as! String
if tmp == email {
self.firstContainerImage.image = UIImage.init(named: "greenCheck.png")
}
}
}
});
}
编辑 2
我更改了设置用户的方式
self.ref.child("users").child((user?.uid)!).setValue(["Email": email])
所以现在我的数据库看起来像这样
users
*****uid*****
Email: "test@test.com
【问题讨论】:
-
当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。如果没有结果,您将得到一个空列表。您需要查看
snapshot.hasChildren()。见firebase.google.com/docs/reference/ios/firebasedatabase/api/… -
@FrankvanPuffelen 我阅读了该文档并看到了 snapshot.hasChild(String) ...当我使用它并输入电子邮件时,我收到一个崩溃说 (hasChild:) 必须是非空的字符串且不包含 '.' '#' '$' '[' 或 ']''
-
我链接到
hasChildren()(复数),而不是hasChild()(它需要一个字符串参数来指示要检查的孩子)。
标签: swift firebase firebase-realtime-database firebase-authentication