Firestore/Swift 4:检查用户名是不是存在?

Posted

技术标签:

【中文标题】Firestore/Swift 4:检查用户名是不是存在?【英文标题】:Firestore/Swift 4: Check username exists?Firestore/Swift 4:检查用户名是否存在? 【发布时间】:2018-07-13 23:32:41 【问题描述】:

我正在尝试了解以下代码可能出错的地方。我试图寻找一种方法来检查users 集合是否在username 字段中的一个文档中包含一个字符串。

结构看起来像这样

#users(collection)
    #userID(document)
        #name:String
        #email:String
        #username:String
    #userID(document)
        #name:String
        #email:String
        #username:String

我要检查的是在users 和任何document, 内是否存在username 字段中的字符串。通过调用函数来查询用户名,找到了这个问题的可能解决方案(以及其他问题)here。

我在扩展中创建了函数:

extension UITextField 

    func checkUsername(username: String, completion: @escaping(Bool) -> Void) 
        let usernameRef = Database.database().reference()
        usernameRef.child("users").queryOrdered(byChild: "username").queryEqual(toValue: username).observeSingleEvent(of: DataEventType.value, with:  (snapshot: DataSnapshot) in
            if snapshot.exists() 
                completion(true)
            
            else 
                completion(false)
            
        )
    


并在 textFieldDidEndEditing 中的文本字段上调用它,以便它可以在用户尝试声明用户名时执行检查。

func textFieldDidEndEditing(_ textField: UITextField) 

    if activeField == usernameField 
        textField.checkUsername(username: usernameField.text!)  isExist in
            if isExist 
                print("Username exists")
             else 
                print("Username does not exist")
            
        
    


但是,这总是将'Username does not exist' 返回到控制台,即使用户名确实存在。

数据库中当前有 1 个名为 test 的用户名,因此尝试输入 test 应返回 'Username exists',输入 testtwo 应返回 'Username does not exist'

我在这里可以缺少什么?我假设它没有正确查询数据库?

【问题讨论】:

您将问题标记为 Cloud Firestore,但在代码中使用了 Firebase 实时数据库。这两个数据库完全不同,你用的是哪一个? Firestore :) 如果我尝试检查实时数据库而不是 Firestore 数据库,我认为这就是问题所在。 是的,这绝对行不通。请务必在此处查看有关获取文档的 Firestore 文档:firebase.google.com/docs/firestore/query-data/get-data 谢谢!现在看看我需要修改什么?关于这一点,最好在创建用户时将所有用户名放入一个名为“用户名”的单独集合中,所以我只需要查询集合中的文档,而不是单独查询每个文档以获取具有用户名? 性能方面几乎相同,所以我会选择最简单的解决方案。 【参考方案1】:

感谢 Frank 指出我调用的是实时数据库而不是 Firestore。更新了我的代码以在检查文档中存储在 'username' 中的任何内容时返回 truefalse 值,并认为如果其他人试图在他们的 Firestore 数据库中检查 'usernames',我会分享我的更新代码。

在 UITextField 上创建了一个扩展,当我需要检查用户名是否可用时调用它:

func checkUsername(field: String, completion: @escaping (Bool) -> Void) 
    let collectionRef = db.collection("users")
    collectionRef.whereField("username", isEqualTo: field).getDocuments  (snapshot, err) in
        if let err = err 
            print("Error getting document: \(err)")
         else if (snapshot?.isEmpty)! 
            completion(false)
         else 
            for document in (snapshot?.documents)! 
                if document.data()["username"] != nil 
                    completion(true)
                
            
        
    

然后在UITextFieldtextDidEndEditing上,我调用的函数是活动字段是用户名字段:

func textFieldDidEndEditing(_ textField: UITextField) 

    if activeField == usernameField 
        if textField.text?.isEmpty == false 
            textField.checkUsername(field: textField.text!)  (success) in
                if success == true 
                    print("Username is taken")
                    // Perform some action
                 else 
                    print("Username is not taken")
                    // Perform some action
                
            
        
    

 

如果我尝试输入存在于任何文档username 字段中的用户名,则返回'Username is taken',如果没有找到,则返回'Username is not taken'

如果有人对改进代码有任何反馈或有任何问题,请告诉我。我很乐意更新以供参考。 :)

【讨论】:

以上是关于Firestore/Swift 4:检查用户名是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

检查用户名是不是有来自名称的 4 个连续字母 - javascript

XMPP Smack 4.1.0 检查用户是不是已经注册

laravel 4.2 如何检查是不是有用户登录多重身份验证

如何删除 SnapShot 侦听器(Firestore - Swift)

如何读取 Firestore (Swift) 中字段的值

如何检查用户是不是使用 FB SDK 4.0 for Android 登录?