ios - Swift -FirebaseDatabase 如何计算和迭代仅是 keyId 的子项?

标签 ios swift firebase firebase-realtime-database count

我的布局是这样的

@locationRef
    |
    @---LtFirstKeyUqABC123
    |       |--key1:val1
    |       |--key2:val2
    |
    @---LtLastKeyrUqXYZ789
    |       |--key1:val1
    |       |--key2:val2
    |
    |---address: "123 Broadway"
    |---city: "Bronx"
    |---state: "NY"
    |---zipcode: "10025"
    |---country: "United States"

我只想计算和迭代 Firebase KeyID,而不是其他数据。例如,上面的 locationRef 有 7 个子项,但这 7 个子项中只有 2 个是 keyId(LtFirstKeyUqABC123LtLastKeyrUqXYZ789),它们有自己的 2每个 child 。

var startKey: String?
var totalCountOfKeyIds = 0

Database.database().reference().child("locationRef")
  .queryOrderedByKey()
  .queryLimited(toLast: 10)
  .observeSingleEvent(of: .value) { (snapshot) in

     if !snapshot.exists() {
        self.totalCountOfKeyIds = 0
        return
     }

     for childSnapshot in snapshot.children {

         let snap = childSnapshot as! DataSnapshot

         // totalCountOfKeyIds = Int(snap.childrenCount) doesn't work
         print(Int(snap.childrenCount)) // on every loop this gives me the 2 children under each keyId

         if snap.exists() {

              // loop through children
              guard let children = snap.children.allObjects.first as? DataSnapshot else { return }
              for child in snap.children.allObjects as! [DataSnapshot] {

                  if let dict = child.value as? [String: Any] {
                      // get dict values
                  }
              }
              self.startKey = children.key
         }
     }
})

完成后,totalCountOfKeyIds 应仅等于 2,而 startKey 应为 LtLastKeyrUqXYZ789

我该怎么做?

最佳答案

出于多种原因,在一个节点下混合不同的实体类型是一个坏主意,其中之一就是您在此处遇到的原因。我建议重构您的数据模型,使其具有两个顶级列表,名称属性位于其中一个列表下,推送 ID 位于另一个列表下。

也就是说,在您当前的结构上,您可以通过以下方式获取计数:

  1. 排除您不想计数的属性。
  2. 减去您不想计算的属性数量。

第一个看起来像这样:

let excludedKeys = ["address", "city", "state", "zipcode", "country"]
Database.database().reference().child("locationRef")
  .queryOrderedByKey()
  .queryLimited(toLast: 10)
  .observeSingleEvent(of: .value) { (snapshot) in
    self.totalCountOfKeyIds = 0

    for childSnapshot in snapshot.children.allObjects as! [DataSnapshot] {
        for child in childSnapshot.children.allObjects as! [DataSnapshot] {
            if !excludedKeys.contains(child.key) {
                self.totalCountOfKeyIds = self.totalCountOfKeyIds + 1
            }
        }
    }
})

关于ios - Swift -FirebaseDatabase 如何计算和迭代仅是 keyId 的子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58825207/

相关文章:

iphone - 如何按最近事件对 GKTurnBasedMatch 进行排序?

iphone - 单击表格单元格时的阴影背景

objective-c - 将方法作为 SEL 参数传递给另一个类方法

ios - Xcode:使用 pod 依赖项创建框架

IOS - UITableView 单元格,单击单元格内的 UIImageView 但停止调用 didSelectRowAtIndexPath

swift - 快速多个弹出窗口

ios - Cocoapods 没有将添加到 Xcode 框架的项目视为可行目标

swift - 我应该如何从 Firebase 检索数据到 UICollectionViewCell?

firebase - 将 Firebase Crashlytics 数据部分导出到 BigQuery

ios - 尽管初始化成功,但 iOS 的 Firebase 崩溃报告不会发送崩溃