【问题标题】:Accessing Nested Children in Firebase Database Swift 3访问 Firebase 数据库 Swift 3 中的嵌套子项
【发布时间】:2018-07-29 09:09:30
【问题描述】:

我目前的firebase数据库结构是这样的

customer
  -L1x2AKUL_KNTKXyza
    name:"abc"
    subscription
      -L1x2AKlvmG0RXv4gL
        sub_no: "123"
        sub_name: ""
      -L1x2AKlvmG0RXv4ab
        sub_no: "456"
        sub_name" ""
  -L1x2AKUL_KNTKXymk
    name:"xyz"
    subscription
      -L1x2AKlvmG0RXv4xy
        sub_no: "789"
        sub_name: ""

我正在尝试一次访问所有客户记录的所有订阅。

这是我正在使用的代码:

var ref: DatabaseReference!

ref = Database.database().reference(withPath: "customer")

ref.observe(.value, with: { snapshot in
        let enumerator = snapshot.children

        while let rest = enumerator.nextObject() as? DataSnapshot {

            let imageSnap = rest.childSnapshot(forPath: "subscription")
            let dict = imageSnap.value as! NSDictionary

            //self.vehicleListDict.append(dict.object(forKey: "sub_no") as! NSDictionary)

            print("value : \(dict)")

        }
        print("vehicleListDict : \(self.vehicleListDict)")
    }) { (error) in
        print(error.localizedDescription)
    }

我无法一次访问所有客户记录中的所有订阅。它只能访问到一个级别。我试图在存在的 while 中放置一个 while 循环,但这也没有给我所需的输出。相反,它进入无限循环。请任何人都可以帮忙。我是第一次使用 firebase 实时数据库。

获取的值应该是

123
456
789

【问题讨论】:

  • 你的要求没有意义。
  • 我需要一个所有订阅的列表..并且它们与每个客户的详细信息一起存储..所以需要这样遍历它
  • 这些功能应该是我谷歌云功能完成的。
  • 这很容易做到。但是,您能否解释一下您为什么需要这些数据(即用例是什么 - 为什么您希望一次为所有客户提供所有订阅),因为它可能需要 Firebase 结构的重新工具才能真正获取数据出你想要的。
  • @Jay 有一个下拉菜单,其中需要显示所有订阅。我无法更改 Firebase 结构。必须从当前结构本身获取。你能帮忙吗..我还在努力解决这个问题

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


【解决方案1】:

具体做你所要求的代码是

let customerRef = self.ref.child("customer")
customerRef.observe(.childAdded, with: { snapshot in
    let subscriptionSnap = snapshot.childSnapshot(forPath: "subscription")
    for child in subscriptionSnap.children {
        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]
        let subNo = dict["sub_no"] as! String
        print(subNo)
    }
})

输出是

a123
a456
a789

*请注意,我将 sub_no 作为字符串读取,这就是我在前面添加“a”的原因。如果它们实际上是整数,则将行更改为

let subNo = dict["sub_no"] as! Integer

*note2 这会将 .childAdded 观察者留给有问题的主节点,因此添加的任何其他子节点都会触发闭包中的代码。

编辑:

如果您只想一次检索所有数据而不留下 childAdded 观察者,那么这样做:

let customerRef = self.ref.child("customer")
customerRef.observeSingleEvent(of: .value, with: { snapshot in
    for customerChild in snapshot.children {
        let childSnap = customerChild as! DataSnapshot
        let subscriptionSnap = childSnap.childSnapshot(forPath: "subscription")
        for subscriptionChild in subscriptionSnap.children {
            let snap = subscriptionChild as! DataSnapshot
            let dict = snap.value as! [String: Any]
            let subNo = dict["sub_no"] as! String
            print(subNo)
        }   
    }
})

输出是

a123
a456
a789

【讨论】:

  • 感谢您的回复,杰!在获取嵌套子项时,我还有一个类似的问题。您可以发起相同的聊天吗?
  • @Dia 如果这是一个不同的问题,请将其作为一个问题发布,我们会看看。
猜你喜欢
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多