筛选数据库子级,并将每个名称返回为String

时间:2019-07-18 19:13:25

标签: swift firebase firebase-realtime-database swift4

我一直在使用Firebase Realtime Database(通过CocoaPods)开发最新版本的Xcode和Swift中的应用程序,但我遇到了很大的问题。我想筛选数据库的每个子项,只返回其中包含“ user:cvb”的子项。我找到了一种过滤每个结果的方法,但是在此之后,我想将结果作为String进行查看(我需要将其作为String以便可以以编程方式使用该名称创建标签)。

EX:

users
  cvb
    events
      // This should be read and name: "abgdeze" returned as a String not Any
      randomChildNameThatIWillNotKnow
        name: "abgdeze"
        users: "cvb"
      thisShouldBeFilteredOut
        name: "irrleveant"
        users: "irrleveant"
let xPos = 100
var yPos = 100

let query = userRef.queryOrdered(byChild: "users").queryEqual(toValue: filters)

query.observe(.value, with: { (snapshot) in
  for childSnapshot in snapshot.children {
    print(childSnapshot as? String ?? "")

    let labelNum = UILabel()

    labelNum.text = childSnapshot as? String
    labelNum.textAlignment = .center
    labelNum.layer.borderWidth = 1.0
    labelNum.layer.borderColor = UIColor.lightGray.cgColor
    let bounds = UIScreen.main.bounds
    let width = bounds.size.width
    let split = "\(width / 7)".components(separatedBy: ".")
    let oneSeventh = Int(split[0]) ?? 0
    let oneBox = oneSeventh
    labelNum.frame = CGRect( x: xPos, y: yPos, width: oneBox, height: oneBox)

     self.view.addSubview(labelNum)
     // The Labels display nothing inside and are just blank boxes

     yPos += 100
  }
})





预期:这些框接连显示,其中包含name元素 会发生什么:盒子位置合适但空白。

1 个答案:

答案 0 :(得分:1)

我不确定您的代码中的哪个节点userRef引用了。我相信它必须引用events节点才能使查询正常工作。

let eventsRef = dbRef.child("users").child("cvb").child("events")

一旦获得对events节点的引用,您的问题将归结为仅从快照中提取数据。 snapshot.children是一个NSEnumerator对象,可用于遍历快照的所有子级。实际上,子项只是另一个DataSnapshot对象。要从DataSnapshot对象中提取数据,请使用属性value,该属性返回Any?。然后,您可以将其转换为期望的类型(在您的情况下为[String : String])。

    let eventsRef = Database.database().reference().child("users").child("cvb").child("events")
    let query = eventsRef.queryOrdered(byChild: "users").queryEqual(toValue: "cvb")
    query.observe(.value, with: { (snapshot) in
        for child in snapshot.children {
            let childSnapshot = child as! DataSnapshot
            let retrievedEvent = childSnapshot.value as! [String: String]
            let name = retrievedEvent["name"]
            let users = retrievedEvent["users"]
            // .. //
        }
    })