【问题标题】:Search for sub child in firebase using swift使用swift在firebase中搜索子孩子
【发布时间】:2018-03-07 02:02:50
【问题描述】:

这应该很容易,并且有很多类似的问题,但对我没有用。

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

  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 或 boltLocation 中搜索一个孩子但在 joinID 中没有搜索时,获取快照没有问题,这是我的代码还是我的 Firebase 结构关闭?

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案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

    【讨论】:

    • 您好在其他工作中被跟踪,出色的答案先生们。你向我播种了我的数据库结构已关闭并且我的搜索已关闭以寻找一个孩子。使用您的建议,我解决了我的问题。我将为未来的观众和您自己作为专家进行详细说明。首先让我谈谈 Franks 的建议,即创建一个额外的数据结构。我确实有一个现有的数据结构,请参阅manufacturing.show/delmar/FireBaseJoin.png,但是 Google 在上面显示的 Join-List 结构上说“只读模式已激活”,我觉得由于有超过 40K 的连接,我的 JSON 树效率低下 c next com
    • 加入代表一个参展商的类别和子类别。所以我想出了我们几天前讨论过的方案。现在我用你的答案让它工作了。新结构见manufacturing.show/delmar/FireBaseExList.png。以及新的快速代码,感谢您的帮助........ let textj = "join/" let text = textj + detailNamer! print ("in exsubvie detail Name (text).") let Ref = Database.database().reference(withPath: "Exhibitors-List").queryOrdered(byChild:text).queryEqual(toValue:1) Ref.observe( .value,带有:{ 中的快照
    • detailNamer 是一个变量,例如“1-22”,它来自上一个表视图。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
       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()
      
      })
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-21
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多