使用swift在firebase中搜索子子节点

时间:2018-03-07 02:02:51

标签: swift firebase firebase-realtime-database

这应该很简单,并且有很多类似的问题,但对我来说没有任何作用。

Firebase Structure

这是我的代码,应该打印快照但不是。

  override func viewDidLoad() {
      super.viewDidLoad()


     let Ref = Database.database().reference(withPath: "Exhibitors-List/join").queryOrdered(byChild: "joinID").queryEqual(toValue:"1-22")

    ref.observe(.value, with: {
      snapshot in
      var newItems: [Exhibitors] = []

      for item in snapshot.children{
        print(snapshot.value as Any)
        let joinItem = Exhibitors(snapshot: item as! DataSnapshot)
        newItems.append(joinItem)
      }

      self.items = newItems
      self.tableView.reloadData()

    })
  }

在idComp或boothLocation中搜索一个孩子而不是在joinID中搜索一个孩子时,我没有问题,那么它是我的代码还是我的Firebase结构关闭了?

3 个答案:

答案 0 :(得分:1)

当您在某个位置运行查询时,Firebase会检查该位置的每个子项以查找您订购的属性。 Exhibitors-List/join中没有数据,因此查询没有结果。

相反,您想要做的是在Exhibitors-List上运行查询,然后在join/joinID/0上订购/过滤:

 let Ref = Database.database().reference(withPath: "Exhibitors-List/join").queryOrdered(byChild: "joinID/0").queryEqual(toValue:"1-22")

这样可行,但前提是您在索引0中拥有所需的joinId。

您实际上要做的是在此处进行反向查找。您当前的数据结构有助于查找给定参展商的连接ID。找到现有参展商的加入ID并不好。为了有效地实现这一点,您需要创建一个额外的数据结构:

joinIds: {
  joinId1: {
    exhibitorId1: true,
    exhibitorId2: true
  },
  joinId2: {
    exhibitorId2: true
  }
}

通过这种额外的结构,您可以从/joinIds/1-22快速查找参展商ID。

另见我的解释:Firebase query if child of child contains a value

答案 1 :(得分:0)

您的代码要求查询位置Exhibitors-List/join,但您的数据库中不存在该位置。据我所知,还有另一个节点0位于Exhibitors-List和最近的join子节点之间。查询时不能跳过元素 - 您需要在完全存在的路径上查询。

答案 2 :(得分:0)

 override func viewDidLoad() {
   super.viewDidLoad()

   let textj = "join/"
   let text =  textj + detailNamer!


   let Ref = Database.database().reference(withPath: "Exhibitors-   List").queryOrdered(byChild:text).queryEqual(toValue:1)

Ref.observe(.value, with: {
  snapshot in
  var newItems: [Exhibitors] = []

  for item in snapshot.children{
    print(snapshot.value as Any)
    let joinItem = Exhibitors(snapshot: item as! DataSnapshot)
    newItems.append(joinItem)
  }

  self.items = newItems
  self.tableView.reloadData()

})

}