搜索 firebase 数据:iOS、Swift
Posted
技术标签:
【中文标题】搜索 firebase 数据:iOS、Swift【英文标题】:Searching through firebase data: iOS, Swift 【发布时间】:2016-09-14 14:06:50 【问题描述】:我想知道这是否可能以及如何通过 firebase 进行搜索。 我的应用程序有一个文本字段,您可以在其中填写一些通过数组“保存”的规范..
例如:
var arrayOfSpecs = ["13'", "Black"]
现在我想使用 2 个分段选项进行搜索:
搜索规格为 13" 或黑色" 的电子设备之一的名称(此电子设备可能有其他规格;但必须至少包括给定规格之一)
搜索一个只有我写的规格的 Elektronics 的名称,可以少一些规格,但不要比该人搜索的地方多。
示例:搜索“black”“13inch”; searchResults 可能包括具有一种规格的 Macbook:“黑色”,但也可能包括具有两种规格的 Macbook Pro:“黑色”和“13 英寸”,但不能包括具有以下规格的 Macbook Air:“黑色”、“ 13 英寸”、“视网膜”
searchResult 将出现在 tableview 中,或者将 searchResults 的正确名称存储在数组中,我将放入 UITableView
在我的数据库下面,我希望你明白我在寻找什么。
谢谢
【问题讨论】:
【参考方案1】:将您的 JSON 结构更改为
Electroniks:
Macbook:..,
Specification:
13inch : true,
black : true
,
...
,
iPhone:..,
Specification:
13inch : true,
black : true,
camera : true
,
...
,
iPad:..,
Specification:
xinch : true,
red : true,
camera : true
,
...
我不认为你可以一次匹配两个节点查询,但你可以的是,你可以一次匹配一个规范.queryEqualToValue
因此一种解决方法是:- 检索所有具有一个特定 规范 的父节点,然后遍历它们以匹配您的其他 规范
let parentRef = FIRDatabase.database().reference().child("Elektronics")
parentRef.queryOrderedByChild("Specification/black").queryEqualToValue(true).observeSingleEventOfType(.Value, withBlock: (snap) in
if let dict = snap.value as? [String:AnyObject]
for each in dict
print(each.0) //Would retrieve you every product name with colour black in specification i.e Macbook and iPhone
print((each.1["Specification"] as! NSDictionary).count)//Number of specification
parentRef.child("each.0").child("Specification").child("13inch").observeSingleEventOfType(.Value, withBlock: (snapshot) in
if snapshot.exists()
print(each.0) //You found your product's with exactly 13inch and black Specification.This is their name
)
else
print(snap.ref)
)
【讨论】:
通过这个我修复了它,所以我可以根据规格进行搜索。但是当它在他的规格中至少有一个搜索规格时,它会搜索每个产品并显示每个产品的键。但现在我只想搜索具有我的搜索规格或更少的产品。 like -> iPhone, "black" = true, "retina"= true, 我搜索黑色视网膜和 5 英寸。 iphone 出现.. 我搜索黑色.. 什么都没有出现,因为 iphone 有额外的规范.. 你知道我该如何解决这个问题还是我在堆栈上问一个新问题? @adams.s 评论并不是真正扩展您的问题的地方,如果您有任何问题,请将它们作为新鲜的,SO 没有限制。 Q 你发布的 :) 并且更清楚你的目标是什么,因为它是排序和过滤问题已经搞砸了。 :)【参考方案2】:所以从所有产品的产品节点开始。节点名称是使用 childByAutoId 创建的。
products
-abcde
name: MacBook
color: black
display: retina
port: Thunderbolt
size: 13
-fghij
name: MacBook Air
color: black
display: standard
port: USB
size: 13
-xxxxx
name... etc etc
然后我们将规格进行划分,再参考每个节点的产品。
specs
black
13
abcde: true
fghij: true
15
xxxx: true
grey
13
yyyy: true
zzzz: true
15
qqqq: true
13
abcde: true
fghij: true
yyyy: true
zzzz: true
如果您想要全黑的 13 英寸 Mac,请观察 .Value 上的 SingleEventOfType
specs/black/13
将在 abcde 和 fghij 产品参考中加载的节点。
如果您想获得所有灰色 15 英寸笔记本电脑,请在
上执行相同操作specs/grey/15
节点。
如果您想要所有 13 英寸笔记本电脑,请遵守
specs/13
节点
这样做的好处是您根本不需要任何查询,因为您清楚地知道您在寻找什么数据。与观察事件相比,查询非常繁重。
另一种选择是将规范编译成单行
specs
-abcde
black_13_retina_SSD_Thunderbolt
13_retina_SSD_Thunderbolt
retina_SSD_Thunderbolt
SSD_Thunderbolt
Thunderbolt
.
.
-fgijk
black_13_standard_SSD_USB
13_standard_SSD_USB
etc
然后您可以轻松查询所有具有 SSD_Thunderbolt 的模型。
您还可以查询所有开头为:13_ 和结尾为:13_ 的产品
您需要将各种组合放入每个规格中,以便查询 13_SSD,但如果您只有 3 或 4 个规格,那还不错。
请记住 - 磁盘空间很便宜,不要害怕以不同格式复制数据以获取您想要的数据。此外,制作一个解析器来读取主要产品,对其进行解析并将规范转储到它们的组合中非常简单。
希望对您有所帮助。
【讨论】:
【参考方案3】:您也可以使用 SQL 解决方案来代替键值。 Firebase 是严格意义上的键值数据库。
【讨论】:
以上是关于搜索 firebase 数据:iOS、Swift的主要内容,如果未能解决你的问题,请参考以下文章
在“抽认卡”中显示来自 iOS 中 Firebase 的数据
Cordova ios - 尚未配置默认 Firebase 应用