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

时间:2018-03-21 14:03:22

标签: ios swift firebase firebase-realtime-database swift4

我有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])
            }

        })
}

enter image description here

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

2 个答案:

答案 0 :(得分:1)

如果您尝试在登录时存储用户的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
})

答案 1 :(得分:1)

您仍然需要使用with open('filename.txt', 'r') as f: lines = f.readlines() years = [line.split()[0] for line in lines if line.strip()!=''] nums = [line.split()[-1] for line in lines if line.strip()!=''] for year in sorted(set(years)): values = [float(n) for y, n in zip(years, nums) if y==year] avg = sum(values)/len(values) print('Year: {}\tAverage: {:.2f}'.format(year, avg)) 指明您要订购/过滤的属性:

queryOrdered(byChild:)