我想获取包含键入文本的快照。例如,节点看起来像这样
"Team": {
"Yankees": {
"uid1": "name",
"uid2": "name"
},
"Angels": {
"uid1": "name"
"uid3": "name"
}
如果用户在搜索栏中键入yan
,那么我想获取“洋基队”快照。我看到一些文件和堆叠在流动的帖子,并尝试这样
ref.child("Team").queryStarting(atValue: "yan").queryEnding(atValue: "yan\u{f8ff}").observe
但它不起作用。我怎样才能做到这一点?谢谢!
Firebase搜索区分大小写。由于您的密钥以大写的Y
开头,因此查询仅匹配它是否也这样做:
ref.child("Team")
.queryOrderedByKey()
.queryStarting(atValue: "Yan")
.queryEnding(atValue: "Yan\u{f8ff}").observe
我也queryOrderedByKey()
明确你要订购/过滤的内容。
如果要允许不区分大小写的过滤,则典型方法是向每个团队添加具有全小写值的属性:
"Team": {
"Yankees": {
"teamNameForSearch: "yankees",
"uid1": "name",
"uid2": "name"
},
"Angels": {
"teamNameForSearch: "angels",
"uid1": "name"
"uid3": "name"
}
现在您可以搜索:
ref.child("Team")
.queryOrdered(byChild: "teamNameForSearch")
.queryStarting(atValue: "yan")
.queryEnding(atValue: "yan\u{f8ff}").observe
最后要注意的是,这两种方法只进行所谓的前缀匹配:它们找到的名称以用户输入的名称开头的团队。如果您想要一个包含操作(如问题标题所示),您将不得不超越Firebase寻求解决方案。有关更多信息,请参阅Kato的答案:Firebase query - Find item with child that contains string
您需要将db更改为:
"Team": {
"randomid": {
"team":"Yankees",
"uid1": "name",
"uid2": "name"
},
"randomid": {
"team":"Angels"
"uid1": "name"
"uid3": "name"
}
现在你可以这样做:
ref.child("Team").queryOrdered(byChild: "team").queryStarting(atValue: "Yan").queryEnding(atValue: "Yan\u{f8ff}").observe
首先在上面的查询中,您需要使用queryOrdered()
来了解您要订购的孩子。
同样在您的数据库中,节点Team
不等于任何东西,它是具有子节点的父节点。
所以要解决这个问题,节点Team
需要等于一个值(就像在这个答案中的数据库中一样),这样你就可以对它进行排序并在其上使用queryStarting和queryEnding。