swift - 过滤数据库子项并将每个名称作为字符串返回

标签 swift firebase firebase-realtime-database swift4

我一直在使用 Firebase 实时数据库(通过 CocoaPods)在最新版本的 Xcode 和 Swift 中开发一个应用程序,但我遇到了一个大问题。我想过滤我数据库的每个子项,只返回其中包含“user: cvb”的子项。我找到了一种过滤每个结果的方法,但在此之后我想将结果的同级视为一个字符串(我需要它是一个字符串,以便我可以通过编程方式创建一个具有此名称的标签)。

例如:

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元素 发生了什么:盒子位置正确但空白。

最佳答案

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

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

一旦您获得对events 节点的引用,您的问题就归结为仅从快照中提取数据。 snapshot.children 是一个 NSEnumerator 对象,您可以使用它来遍历快照的所有子项。事实上, children 只是另一个 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"]
            // .. //
        }
    })

关于swift - 过滤数据库子项并将每个名称作为字符串返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101270/

相关文章:

ios - 愿意在 Swift 中调整 View 大小时出现错误消息

java - Firebase 数据库总是返回 null

javascript - 无法在 firebase 中获取对象键

android - 错误 : Please fix the version conflict either by updating the version of the google-services plugin

ios - 从 Firebase 检索数据等于意外的 nil - swift

ios - 停止/取消在 AWS S3 上上传

swift - Swift 3 中的滑动手势

ios - 以编程方式快速创建动态高度 UIImageViews

ios - 火力地堡错误 : Calls to setPersistenceEnabled must be made before any other usage of FIRDatabase instance

javascript - 使用箭头函数的 forEach sum 在 Firebase 实时数据库中给出了意外的结果