我对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"
}
}
欢迎任何帮助。谢谢!
答案 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节点,您的用户节点就可以正常工作。