Firebase查询(在swift中)确定用户名是否已存在于数据库中

时间:2017-02-07 21:22:40

标签: ios swift search firebase firebase-realtime-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
            }
})

DB结构如下:

{
  "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"
  }
}

欢迎任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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节点,您的用户节点就可以正常工作。