我的布局是这样的
@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(LtFirstKeyUqABC123
和 LtLastKeyrUqXYZ789
),它们有自己的 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 位于另一个列表下。
也就是说,在您当前的结构上,您可以通过以下方式获取计数:
- 排除您不想计数的属性。
- 减去您不想计算的属性数量。
第一个看起来像这样:
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/