如何检查 Firebase 数据库中的唯一用户名(swift)

Posted

技术标签:

【中文标题】如何检查 Firebase 数据库中的唯一用户名(swift)【英文标题】:How to check unique username in Firebase Database (swift) 【发布时间】:2018-03-21 14:03:21 【问题描述】:

我有 Firebase 数据库,其中每个用户都有自己的电子邮件和用户名。如何检查唯一的用户名?我试着让它这样,但我的代码不能正常工作,因此不同的用户可以有相同的用户名

  usernameField.isHidden = false
    let username:String = self.usernameField.text!

    if (usernameField.text?.isEmpty == false)
    ref.child("users").queryOrdered(byChild("username").queryEqual(toValue: username).observeSingleEvent(of: .value, with:  snapshot in

            if snapshot.exists()

                print("username exist")

            else

                ref.root.child("users").child(userID).updateChildValues(["username": username])
            

        )

我是 Firebase 的新手,我为每个用户存储电子邮件和用户名,例如 newUserReference.setValue(["username":String(), "email" : self.emailTextField.text!])。在下一个视图中,用户可以在usernameField.text 中键入username,此值将添加到 Firebase 数据库中。但是如果下一个用户(用户 2)将输入与前一个用户相同的用户名,它必须被阻止,因为用户名应该是唯一的

【问题讨论】:

【参考方案1】:

您仍然需要使用queryOrdered(byChild:) 指明您想要订购/过滤的属性:

if (usernameField.text?.isEmpty == false)
    ref.child("users").queryOrdered(byChild:"username").queryEqual(toValue: username).observeSingleEvent(of: .value, with:  snapshot in

        if snapshot.exists()

【讨论】:

我也尝试使用此行,但它无法阻止不同帐户中的现有用户名。我在控制台上收到此消息:您的数据将在客户端下载和过滤。考虑将 /users 处的 ".indexOn": "username" 添加到您的安全规则中以获得更好的性能 该警告只是意味着您需要在/users 上定义一个索引。请参阅firebase.google.com/docs/database/security/indexing-data 或其中一些:***.com/…【参考方案2】:

如果您尝试在登录时存储用户 ID,请在收到对登录的成功响应时执行此操作:

创建一个共享实例来存储 ID

class userDataSource 
    var id : String? // variable to store your users ID
    static let sharedInstance = PageDataSource() // global access to this dataSource
    private init() 

登录成功后给id赋值

func getIDFromLogin() 
    if let user = Auth.auth().currentUser 
        print(user.uid)
        userDataSource.sharedInstance.id = user.uid
    

然后可以这样查看每个id:

 ref.child("users").observeSingleEvent(of: .value, with:  snapshot in
     if let snapshots = snapshot.children.allObjects as? [DataSnapshot]  
         for snap in snapshots 
             print(snap.key) // you can compare userDataSource.sharedInstance.id to this value
          
          
 )

或者,如果您只是想要该用户的数据,请执行以下操作:

ref.child("users").child(userDataSource.sharedInstance.id!).observeSingleEvent(of: .value, with:  snapshot in
     if let snapshots = snapshot.children.allObjects as? [DataSnapshot]  
             for snap in snapshots 
                 print(snap) 
          
          
 )

编辑以更准确地回答您的问题

这是一个更符合您的问题的答案。我建议的第一件事是向 Firebase 添加一个仅包含用户名和它们所属的 .uid 的表。您需要先通读该表以确保没有其他人拥有该用户名,然后相应地更新该表:

// This function will check through all of the usernames and return a true or false value in the completion handler
func checkUsernames(_ completion: @escaping(_ success: Bool) -> Void) 
    ref.child("usernames").observeSingleEvent(of: .value, with:  snapshot in
        if let snapshots = snapshot.children.allObjects as? [DataSnapshot]  
            for snap in snapshots 
                if snap.value == username 
                    completion(false)
                
            
            completion(true) 
         else 
            completion(true) // TODO: check for errors before setting completion
             
    )


// this function will set the username values in Firebase
func storeUsername() 
    let usernameRef = ref.child("usernames")
    usernameRef.updateChildValues(["\(userDataSource.sharedInstance.id!)" : username])
        
    

假设您已经处理了 username 变量并设置了它的值,您将像这样调用函数:

checkUsernames( (success) in
    if success 
        storeUsername()
        // you may also want to update your "users" table here as well
     else  print("Duplicate Username")  // handle alert or something here
)

【讨论】:

不起作用,我收到错误Type 'DataSnapshot' does not conform to protocol 'Sequence' 您是否尝试在登录时存储您的用户 ID?你的目标是什么? 我正在尝试存储用户的用户名,并检查唯一的用户名(用户名是否已经存在于不同的帐户中?)。例如,如果电子邮件:anna@gmail.com 有用户名“hellowrold”,则用户 margo@gmail.com 不能有用户名“hellowrold” 好的。我已经编辑了我的答案,但我需要再次编辑它才能给你更准确的回复。一分钟。 很抱歉,我是 Firebase 的新手,我想我没有很好地解释我的问题是什么。我只使用电子邮件和密码登录页面,但在我的数据库中,我为每个用户存储电子邮件和用户名,例如newUserReference.setValue(["username":String(), "email" : self.emailTextField.text!])。在下一个视图中,用户可以在usernameField.text 中输入用户名,该值将添加到 Firebase 数据库中。但是如果下一个用户(用户 2)将输入与前一个用户相同的用户名,它将阻止,因为用户名应该是唯一的

以上是关于如何检查 Firebase 数据库中的唯一用户名(swift)的主要内容,如果未能解决你的问题,请参考以下文章

无法检查唯一用户名(Firebase)

如何将用户名列表中的唯一用户名提供给firebase中的用户

带有 Flutter 的 Firebase 中的唯一用户名

检查唯一用户名时 Firebase 权限被拒绝

检查firebase子项是不是具有特定值[重复]

Firebase 安全规则检查孩子的唯一值#AskFirebase