繁体   English   中英

Firebase查询(快速)以确定数据库中是否已存在用户名

[英]Firebase query (in swift) to determine if username already exists in database

我对Firebase和iOS的经验很少,想知道是否可以在Swift中创建查询以在Firebase的JSON结构中查找特定数据。

用户在应用程序中创建帐户时,系统会提示他选择用户名。 当用户在同一屏幕上按下“继续”按钮时,我想实时查询数据库以确定用户选择的用户名是否已经存在。

我在网络上阅读了很多文章,但找不到任何可以实现目标的东西。 到目前为止,我编写了下面的代码,该代码不起作用,但是我无法查明问题的根源(请注意,username.text是用户输入所需用户名并进行验证的文本字段):

FIRDatabase
    .database()
    .reference()
    .child("username")
    .queryOrderedByValue()
    .queryEqual(toValue: self.username.text!)
    .observeSingleEvent(of: .value, with: {(snap) in

            if snap.exists(){
                // Username unavailable, choose another one
            } else {
                // Username available, OK to keep this username
            }
})

数据库结构如下:

{
  "users" : {

      USER_1_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName",
              "last name" : "myLastName",
              "username" : "my.username"
          }
      }

      USER_2_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName2",
              "last name" : "myLastName2",
              "username" : "my.username2"
          }
      }
  }
}

我愿意更改数据库结构以添加“用户名”注释,如下所示,该注释将包含所有注册的用户名(如果可以简化查询的话):

{
  "users" : {

      USER_1_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName",
              "last name" : "myLastName",
              "username" : "my.username"
          }
      }

      USER_2_UID : {
          "account" : {
              "email" : "test@stackoverflow.com",
              "first name" : "myFirstName2",
              "last name" : "myLastName2",
              "username" : "my.username2"
          }
      }
  }

  "listOfUsernames" : {
      USER_1_UID : "my.username"
      USER_2_UID : "my.username2"
  }
}

欢迎您提供任何帮助。 谢谢!

您的代码非常接近。 三个变化:

Remove queryOrderedByValue

然后,您将用户信息埋得太深了

  USER_1_UID : {
      "account" : {
          "email" : "test@stackoverflow.com",
          "first name" : "myFirstName",
          "last name" : "myLastName",
          "username" : "my.username"
      }
  }

更改为(删除不需要的帐户节点名称)

  USER_1_UID : {
    "email" : "test@stackoverflow.com",
    "first name" : "myFirstName",
    "last name" : "myLastName",
    "username" : "my.username"
  }

然后您需要告诉Firebase您正在查询哪个节点

所以改为

let usersRef = rootRef.child("users")
let queryRef = usersRef.queryOrdered(byChild: "username")
                            .queryEqual(toValue: "some user name")
queryRef.observeSingleEvent(of: .value, with: { snapshot in
  print(snapshot) //you need snapshot, or snap or some other var name
})

最后,您不需要listOfUsernames节点,您的users节点也可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM