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