确保在Firebase中创build新用户的唯一用户名(Swift)

我是Firebase的新手,所以任何提示将不胜感激。 现在我正在使用Firebaselogin和身份validation来处理所有的身份validation。 但是我想存储一些用户数据,比如username DOB,created_at …我已经创build了一个用户节点,并且使用我在注册或login时获得的唯一的ID将子节点附加到用户。 但是我想确保系统中没有重复的用户名。 如何在写入服务器之前检查用户名是否已经存在?

我目前正在调查同样的事情。 我的问题是,我也希望启用持久性,所以我需要知道什么可以离线访问。 如果您使用的是持久性,我也build议不要执行特定的操作,例如,如果您的客户端处于脱机状态,请检查用户名的存在,您可以通过监听“.info / connected”

https://firebase.google.com/docs/database/ios/offline-capabilities#section-connection-state

我个人的工作stream程如下:

  1. login到用户的帐户
  2. 检查用户是否已有用户名

检查Firebase数据库,看他们的用户详细信息是否包含用户名:

DB/users/*userUID*/username != nil 
  1. 如果他们没有用户名,则提示他们设置用户名。

当他们设置他们的用户名时,检查用户名是否存在于:

 DB/usernames/*username*/ != nil 

如果不存在,则将用户名和userId写入上面检查的两个数据库位置。

例如。

user.uid = wewe32323

用户名= scuba_steve

 DB/usernames/scuba_steve = wewe32323 DB/users/wewe32323/username = scuba_steve 

因此,现在您可以快速查看数据库/用户名引用,以查看是否有人拥有用户名,还有DB /用户/您可以快速find给定用户的用户名。

我不会说这是很简单的,因为我还有一些关于并发请求的问题。 我正在研究的当前问题是,假设您将用户名关联删除到特定用户,则用户可以依赖其数据库的本地副本错误地声明他们仍被分配给该用户名。

您可以查看数据库写入规则,以禁止任何人修改现有数据(强制只有在没有现有数据的情况下才能写入数据库/用户名目录),这样可以防止任何设置用户名的人重写,我认为一个重要的步骤。

这也可能是值得调查交易:

https://firebase.google.com/docs/database/ios/save-data#save_data_as_transactions

但是我相信上面提到的正确的书写规则应该允许可靠的书写。

你可以检查用户名是否存储如下:

 let username = "fred" self.ref.child("users/\(username)").observeSingleEventOfType(.Value, withBlock: { snapshot in if snapshot.exists() { 

如果在闭包中返回快照,则存在用户名“fred”。