搜索 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 的数据

iOS Firebase 数据库网址

iOS:无法解析来自 firebase 的推送通知

Cordova ios - 尚未配置默认 Firebase 应用

搜索数据名​​称 Firebase listview android

过滤和显示来自 firebase 数据库的搜索栏结果