如何检查 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)的主要内容,如果未能解决你的问题,请参考以下文章