如何检查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)并在上面的查询中使用它。