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

Ios Firebase查询(在swift中)以确定数据库中是否已存在用户名,ios,swift,search,firebase,firebase-realtime-database,Ios,Swift,Search,Firebase,Firebase Realtime Database,我对Firebase和iOS几乎没有经验,我想知道是否有可能在Swift中创建一个查询来查找Firebase JSON结构中的特定数据 当用户在应用程序中创建帐户时,系统会提示用户选择用户名。当用户按下同一屏幕上的“继续”按钮时,我想实时查询数据库,以确定用户选择的用户名是否已经存在 我在网上读了很多文章,但找不到任何能让我实现目标的东西。到目前为止,我编写了以下代码,但无法确定问题的根源(注意username.text是用户输入所需用户名并进行验证的文本字段): 数据库结构如下: { "u

我对Firebase和iOS几乎没有经验,我想知道是否有可能在Swift中创建一个查询来查找Firebase JSON结构中的特定数据

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

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

数据库结构如下:

{
  "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"
      }
  }
更改为(删除不需要的帐户节点名称)

然后,您需要告诉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
})

最后,您不需要“用户名称列表”节点,您的“用户”节点可以正常工作。

非常感谢您的回复。然而,这对我来说是行不通的。闭包中的代码没有被执行(我通过在{snapshot in,但控制台中从来没有打印任何东西,{snapshot in,但是在控制台中没有打印任何东西,{snapshot in,但是在控制台中没有打印任何东西,}之后放置一个简单的打印(“程序走了这么远”)进行测试)。即使我尝试访问的密钥嵌套在users/**someUniqueUID**/account/username下,该Firebase查询是否可以使用?Thanks@ayarem502哈哈。你说得对!请看我稍微更新的答案,因为它会解决问题。我忽略了每个用户节点中多余的节点名,这是不必要的。我有“帐户”节点,因为我还有一个“profile”节点,其中包含不同类型的信息,为了避免混淆,我在当前帖子中没有包含这些信息。但是,我尝试删除“account”节点并执行代码,但它仍然没有进入闭包。然后我尝试打印查询,查看它将用户名与:print进行比较的内容(FIRDatabase.database().reference().child(“用户”).queryOrdered(byChild:“用户名”))这返回了一些我真的不太理解的内容:(/users{I=username;}).但是我不应该期待一份用户名列表吗?谢谢again@ayarem502我复制了我建议的结构,并使用我答案中的代码运行它,运行时,它返回用户-因此代码可以工作‌​yOrdered(byChild:“username”)),但您还需要.queryEqual(toValue:“some username”)返回与查询匹配的用户。不,它将不返回用户名;它将返回包含该用户名的所有节点。此外,用户不需要帐户节点和配置文件节点。此用例中的数据。为了确保我有以下内容:FIRDatabase.database().reference().child(“用户”).queryOrdered(byChild:“username”).queryEqual(toValue:self.username.text).observeSingleEvent(of:.value,with:{snapshot in…)这等同于您的代码吗?(我尝试将其保留在一行)
  USER_1_UID : {
    "email" : "test@stackoverflow.com",
    "first name" : "myFirstName",
    "last name" : "myLastName",
    "username" : "my.username"
  }
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
})