我想知道它是否可行,以及如何搜索firebase。 我的应用程序有一个文本字段,您可以在其中填写一些已保存的规范'通过数组..
例如:
var arrayOfSpecs = ["13'", "Black"]
现在我想用2个分段选项进行搜索:
搜索规格为13"的其中一个Elektronics的名称或是黑色" (此elektronic设备可能有其他规格;但必须包括至少一个给定的规格)
搜索其中一个只有我编写的规格的Elektronics的名称,规格较少,但没有比搜索者搜索的规格更多的规格。
< / LI>示例:搜索&#34;黑色&#34; &#34; 13inch&#34 ;; searchResults可以包含一个带有一个规范的macbook:&#34; black&#34;,但它也可以包含一个带有2个规格的macbook Pro:&#34; black&#34;和#34; 13inch&#34;,但它不能包括带有规格的MacBook Air:&#34; Black&#34;,&#34; 13英寸&#34;,&#34; Retina&#34;
searchResult会出现在tableview中,或者会将searchResults的正确名称存储在数组中,我会将其放入UITableView
在我的数据库下方,我希望你能理解我在寻找的东西。
THX
答案 0 :(得分:2)
将您的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
因此,解决方法是: - 检索具有一个特定规范的所有parentNode,然后迭代这些以匹配您的其他规范
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)
}
})
答案 1 :(得分:0)
首先从所有产品的产品节点开始。使用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&#34;
上的Macs,observeSingleEventOfType .Valuespecs/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的所有型号。
您还可以查询startsWith:13_和endsWith:13 _
的所有产品您需要在每个规范中添加各种组合,以便查询13_SSD,但如果您只有3或4个规格,那么它就不会太糟糕。
请记住 - 磁盘空间很便宜,不要害怕以不同格式复制数据以取回您想要的内容。此外,制作解析器以读取主要产品,解析它并将规格转储到它们的组合中非常简单。
希望有所帮助。
答案 2 :(得分:0)
您也可以使用SQL解决方案而不是键值。 Firebase严格来说是一个Key-Value数据库。