有人能够解释如何查询Firebase中的特殊字符吗?
我有一些像这样的数据 -
posts
post_1
description: "This is a post! #thisdoesntwork"
post_2
description: "Heres another post! #neitherdoesthis"
如果我在swift中运行查询 -
let db = Database.database().reference()
db.child("posts").queryOrdered(byChild: "description").queryStarting(atValue: "[a-zA-Z0-9]*").queryEnding(atValue: "#thisdoesntwork").observeSingleEvent(of: .value) { (snapshot) in
// No results!
}
什么都没有归来。但是,当我省略像这样的#标签时,它就可以了
db.child("posts").queryOrdered(byChild: "description").queryStarting(atValue: "[a-zA-Z0-9]*").queryEnding(atValue: "thisdoesntwork").observeSingleEvent(of: .value) { (snapshot) in
// One post gets returned here
}
这是因为哈希是一个我需要以某种方式逃脱的特殊角色吗?或者我是以错误的方式查询它?
提前致谢。
答案 0 :(得分:1)
您认为发生的事情并非如此。让我解释并提供一个例子:
您似乎正在尝试执行字符串搜索。甚至可能是子字符串搜索。
Firebase不提供子字符串搜索功能,甚至字符串搜索也不像swift那样完全是字符串搜索。
所以对于初学者来说,这不是有效的
queryStarting(atValue: "[a-zA-Z0-9]*")
将逐字搜索以字符串开头的节点或等于[a-zA-Z0-9] *的字符。因此,如果您的节点看起来如下所示:
posts
post_x
description: "[a-zA-Z0-9]* This node would be returned"
这将是一场比赛。
.startWith: a query that starts with the given string
.endWith: a query ending with a string that starts with the given string
(not the ending part of a string or a substring)
让我提供一个基于您的结构的示例结构
posts
post_1
description: "This is a post! #thisdoesntwork"
post_2
description: "Heres another post! #neitherdoesthis"
post_3
description: "a"
post_4
description: "n"
示例查询
let postsRef = ref.child("posts")
let queryRef = postsRef.queryOrdered(byChild: "description")
.queryStarting(atValue: "This")
.queryEnding(atValue: "z")
queryRef.observeSingleEvent(of: .value) { snapshot in
print(snapshot)
}
此查询将返回帖子1,3和4.为什么?
post_1以字母大写字母T开头,即ascii 84。
查询将返回具有ascii值的所有节点,该值以84(ascii T)开头并以122(ascii z)结尾。所以后3是一个a,它是ascii 97和post 4,一个n,是ascii 110.所以这些都是返回的。
*对于那些跟随的人,查询实际上以“'这个'最后是“' z'但是为这个例子简化了。
虽然一方面看起来有点限制,但它实际上非常强大。
一种用途是当您要查询以特定字符串开头的一系列值时。因此,假设您拥有一家农产品分销公司,并拥有Apple,Banana,Peanut和Walnut等产品。您可以像这样组织数据库
items
item_0
description: fruit_apple
item_1
description: fruit_banana
item_2
description: nut_peanut
item_3
description: nut_walnut
如果你想要一份所有水果的清单,你可以这样查询
let queryRef = postsRef.queryOrdered(byChild: "description")
.queryStarting(atValue: "fruit_")
.queryEnding(atValue: "fruit_")
这称为复合值。
在您的情况下,底线答案是您无法直接搜索字符串中的特殊字符,但是,您可以搜索以ascii代码范围内的字符开头的一系列字符。
查询从"!"开始结束于" /"将返回以字符开头的所有字符串:
33 !
34 \"
35 #
36 $
37 %
38 &
39 '
40 (
41 )
42 *
43 +
44 ,
45 -
46 .
47 /
这个超长的答案并不是一个真正的解决方案,但可能有助于重组您的Firebase,以便您可以获取要查询的数据。