【问题标题】:Searching through firebase data: iOS, Swift搜索 firebase 数据: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

在我的数据库下面,我希望你明白我在寻找什么。

谢谢

【问题讨论】:

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


    【解决方案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 是严格意义上的键值数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2017-05-09
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多