Swift -FirebaseDatabase 如何计算和遍历只有 keyIds 的子项?

Posted

技术标签:

【中文标题】Swift -FirebaseDatabase 如何计算和遍历只有 keyIds 的子项?【英文标题】:Swift -FirebaseDatabase how to count and iterate through children that are only keyIds? 【发布时间】:2019-11-12 19:12:25 【问题描述】:

我的布局是这样的

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

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

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 应该只等于 2startKey 应该是 LtLastKeyrUqXYZ789

我该怎么做?

【问题讨论】:

【参考方案1】:

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

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

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

第一个看起来像这样:

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
            
        
    
)

【讨论】:

这正是你想出的。我将地址、zip 等放在节点裸位置下,然后过滤以查找该节点。我没有添加,因为我不确定是否还有其他方法。无论如何感谢您的帮助! 你能否给我发一个链接到一些文档,这些文档说明了在一个节点下混合数据类型不是一个好主意的所有原因。我在想你所说的,我的几个节点就是这样构造的。我从来没有遇到过说不要那样做。我希望我早知道这个? 见firebase.google.com/docs/database/ios/…

以上是关于Swift -FirebaseDatabase 如何计算和遍历只有 keyIds 的子项?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift:如何为 Swift 3 进行异步/反应式/事件编程

如何为 Swift 转换 MONActivityView 方法

如何为 Swift 3 创建第一个视图

如何处理 NSData 并返回 UIImage (Swift)

swift - 如何处理未捕获的异常

iOS 如何为每个用户获取数据解析 Swift