Ios Swift-FirebaseDatabase如何计算和迭代仅为KeyID的子项?
我的布局是这样的Ios Swift-FirebaseDatabase如何计算和迭代仅为KeyID的子项?,ios,swift,firebase,firebase-realtime-database,count,Ios,Swift,Firebase,Firebase Realtime Database,Count,我的布局是这样的 @locationRef | @---LtFirstKeyUqABC123 | |--key1:val1 | |--key2:val2 | @---LtLastKeyrUqXYZ789 | |--key1:val1 | |--key2:val2 | |---address: "123 Broadway" |---city: "Bronx"
@locationRef
|
@---LtFirstKeyUqABC123
| |--key1:val1
| |--key2:val2
|
@---LtLastKeyrUqXYZ789
| |--key1:val1
| |--key2:val2
|
|---address: "123 Broadway"
|---city: "Bronx"
|---state: "NY"
|---zipcode: "10025"
|---country: "United States"
我只想对FirebaseKeyIDs
进行计数和迭代,而不想对其他数据进行计数和迭代。例如,上述locationRef
有7个子项,但在这7个子项中只有2个是keyid(LtFirstKeyUqABC123
和LtLastKeyrUqXYZ789
),它们各自有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
应仅等于2
,startKey
应为LtLastKeyrUqXYZ789
如何做到这一点?在一个节点下混合不同的实体类型是一个坏主意,原因有很多,其中一个就是您在这里遇到的。我建议重新构造您的数据模型,使其具有两个顶级列表,其中一个列表下有名称属性,另一个列表下有推送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
}
}
}
})
那正是你想到的。我把地址、邮政编码等放在一个节点下,然后过滤寻找那个节点。我没有添加,因为我不确定是否还有其他方法。无论如何,谢谢你的帮助!你能给我发一个指向一些文档的链接吗?这些文档包含了在一个节点下混合数据类型不是一个好主意的所有原因。我在想你说的话,我的几个节点就是这样构造的。我遇到的任何事情都没有说过不要那样做。我希望我在看到之前就知道这一点