如何检查Firebase数据库中用户输入数据的唯一性? swift
How to check the uniqueness of user-entered data in the Firebase database? swift
我开始研究 iOS 的开发几个星期,在创建我的第一个应用程序时,我必须解决实施“用户授权”的问题
出于这些目的,我选择了 Firebase
然后就出现了这样的问题,因为注册用户的时候,我保存了他的邮箱和登录数据库,需要设置一个方法,当你点击“注册”按钮时,会检查数据库中没有这样的邮箱和登录名,然后再继续。
在研究了 Firebase 文档并观看了有关此服务的一些视频后,我尝试按如下方式解决此问题:
private func isNewEmail(_ email: String, completion: _ emailIsNew: Bool -> ()) {
ref = Database.database().reference(withPath: "users")
ref.getData { error, snapshot in
var emailIsNew: Bool = true
guard error == nil else { return }
guard let snapshotValue = snapshot.value as? [String : AnyObject] else {
if snapshot.value as? [String : AnyObject] == nil {
completion(emailIsNew)
return
}
return
}
for item in snapshotValue {
let itemValueDictionary = item.value
guard let emailFromDatabase = itemValueDictionary["email"] as? String else { return }
if email.lowercased() == emailFromDatabase.lowercased() {
emailIsNew = false
break
}
}
completion(emailIsNew)
}
}
接下来,我们调用上述方法,并将电子邮件传递到那里,根据 emailIsNew 的值,我们创建或不创建用户。
最重要的问题:我假设如果我们的数据库中有,例如10,000个用户,那么这样的检查可能需要很长时间,似乎我发现当一个人点击“注册”然后等待 10 分钟让应用程序检查所有内容时 - 这是不可接受的,所以我试图找到另一种方法来解决原来的问题,但不幸的是,我找不到它,因为,我假设,少量的经验。我请你建议如何解决这个问题,如何更改验证方法,或者一般来说,也许可以应用其他方法。
MARK - 我在 Whosebug 上研究了类似的答案,但其中大部分与 android 或 Java 相关,或者我无法应用解决方案来解决我的问题。
因为我只学习英语,所以也许这就是我找不到答案的原因,但我仍然希望收到对我的方法的评论,以及类似问题的链接。谢谢理解。
如果您的 users
的每个 child 都有一个 email
属性 包含您要检查的值,您可以 use a query 只检索匹配节点。
类似于:
var query = ref.queryOrdered(byChild: "email").queryEqual(toValue: email.lowercased())
query.getData { error, snapshot in
...
由于 Firebase 中的所有搜索都是 case-sensitive,这就要求您的数据库已经包含所有小写的电子邮件地址。如果不是这种情况,请考虑使用小写值添加 属性(例如 email_lowercase
)并在上面的查询中使用它。
我开始研究 iOS 的开发几个星期,在创建我的第一个应用程序时,我必须解决实施“用户授权”的问题
出于这些目的,我选择了 Firebase
然后就出现了这样的问题,因为注册用户的时候,我保存了他的邮箱和登录数据库,需要设置一个方法,当你点击“注册”按钮时,会检查数据库中没有这样的邮箱和登录名,然后再继续。
在研究了 Firebase 文档并观看了有关此服务的一些视频后,我尝试按如下方式解决此问题:
private func isNewEmail(_ email: String, completion: _ emailIsNew: Bool -> ()) {
ref = Database.database().reference(withPath: "users")
ref.getData { error, snapshot in
var emailIsNew: Bool = true
guard error == nil else { return }
guard let snapshotValue = snapshot.value as? [String : AnyObject] else {
if snapshot.value as? [String : AnyObject] == nil {
completion(emailIsNew)
return
}
return
}
for item in snapshotValue {
let itemValueDictionary = item.value
guard let emailFromDatabase = itemValueDictionary["email"] as? String else { return }
if email.lowercased() == emailFromDatabase.lowercased() {
emailIsNew = false
break
}
}
completion(emailIsNew)
}
}
接下来,我们调用上述方法,并将电子邮件传递到那里,根据 emailIsNew 的值,我们创建或不创建用户。
最重要的问题:我假设如果我们的数据库中有,例如10,000个用户,那么这样的检查可能需要很长时间,似乎我发现当一个人点击“注册”然后等待 10 分钟让应用程序检查所有内容时 - 这是不可接受的,所以我试图找到另一种方法来解决原来的问题,但不幸的是,我找不到它,因为,我假设,少量的经验。我请你建议如何解决这个问题,如何更改验证方法,或者一般来说,也许可以应用其他方法。
MARK - 我在 Whosebug 上研究了类似的答案,但其中大部分与 android 或 Java 相关,或者我无法应用解决方案来解决我的问题。 因为我只学习英语,所以也许这就是我找不到答案的原因,但我仍然希望收到对我的方法的评论,以及类似问题的链接。谢谢理解。
如果您的 users
的每个 child 都有一个 email
属性 包含您要检查的值,您可以 use a query 只检索匹配节点。
类似于:
var query = ref.queryOrdered(byChild: "email").queryEqual(toValue: email.lowercased())
query.getData { error, snapshot in
...
由于 Firebase 中的所有搜索都是 case-sensitive,这就要求您的数据库已经包含所有小写的电子邮件地址。如果不是这种情况,请考虑使用小写值添加 属性(例如 email_lowercase
)并在上面的查询中使用它。