搜索firebase数据:iOS,Swift

时间:2016-09-14 14:06:50

标签: ios swift search firebase firebase-realtime-database

我想知道它是否可行,以及如何搜索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

enter image description here

3 个答案:

答案 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 .Value
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的所有型号。

您还可以查询startsWith:13_和endsWith:13 _

的所有产品

您需要在每个规范中添加各种组合,以便查询13_SSD,但如果您只有3或4个规格,那么它就不会太糟糕。

请记住 - 磁盘空间很便宜,不要害怕以不同格式复制数据以取回您想要的内容。此外,制作解析器以读取主要产品,解析它并将规格转储到它们的组合中非常简单。

希望有所帮助。

答案 2 :(得分:0)

您也可以使用SQL解决方案而不是键值。 Firebase严格来说是一个Key-Value数据库。