我是Firebase的新手,所以任何提示都将受到赞赏。现在我正在使用Firebase登录& Auth为我处理所有身份验证。但是我想存储一些用户数据,比如用户名DOB,created_at ......我创建了一个用户节点,并且我使用注册或登录时获得的唯一ID将子节点附加到用户。但是,我想确保系统中没有重复的用户名。如何在写入服务器之前检查用户名是否已存在?
答案 0 :(得分:3)
我正在调查同样的事情。我的问题是我也希望启用持久性,所以我需要知道可以脱机访问的内容。如果您正在使用持久性,我还建议不要执行特定的操作,例如在您的客户端离线时检查用户名是否存在,您可以通过收听“.info / connected”来完成此操作,如下所示:
https://firebase.google.com/docs/database/ios/offline-capabilities#section-connection-state
我的个人工作流程如下:
检查firebase数据库以查看其用户详细信息是否包含用户名:
DB/users/*userUID*/username != nil
当他们设置用户名时,请检查用户名是否存在于:
DB/usernames/*username*/ != nil
如果它不存在,则在上面检查的两个数据库位置写入用户名和userId。
例如
user.uid = wewe32323
username = scuba_steve
DB/usernames/scuba_steve = wewe32323
DB/users/wewe32323/username = scuba_steve
所以现在你有了DB / usernames参考,你可以快速查看是否有人已经有用户名,你也有DB / users /,你可以快速找到给定用户的用户名。
我不会说这是万无一失的,因为我仍然担心并发请求。我正在调查的当前问题是,假设您删除了与特定用户的用户名关联,用户可以依赖其数据库的本地副本来错误地断言它们仍然被分配给该用户名。
您可以查看数据库写入规则以禁止任何人修改现有数据(强制您只能在没有现有数据的情况下写入DB / usernames目录。这样可以防止覆盖任何先设置用户名的人,我认为这是重要的一步。
也许值得调查交易:
https://firebase.google.com/docs/database/ios/save-data#save_data_as_transactions
但我相信上面段落中提到的正确的写规则应该允许可靠的写作。
答案 1 :(得分:1)
您可以检查用户名是否存储如下:
let username = "fred"
self.ref.child("users/\(username)").observeSingleEventOfType(.Value, withBlock: { snapshot in
if snapshot.exists() {
如果闭包中返回的快照存在,则存在用户名“fred”。