Firebase观察密钥包含

问题描述 投票:-1回答:2

我想获取包含键入文本的快照。例如,节点看起来像这样

"Team": {
 "Yankees": {
    "uid1": "name",
    "uid2": "name"
   },
"Angels": {
   "uid1": "name"
   "uid3": "name"
 }

如果用户在搜索栏中键入yan,那么我想获取“洋基队”快照。我看到一些文件和堆叠在流动的帖子,并尝试这样

ref.child("Team").queryStarting(atValue: "yan").queryEnding(atValue: "yan\u{f8ff}").observe

但它不起作用。我怎样才能做到这一点?谢谢!

swift firebase firebase-realtime-database
2个回答
1
投票

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


0
投票

您需要将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。

© www.soinside.com 2019 - 2024. All rights reserved.