我有一组分层数据,我想从Firebase检索信息。以下是我的数据显示方式:
但是,我的问题是:在查看数据结构的方式时,当我想抓住name
的{{1}}或object id
时,我必须执行以下操作代码:
attendee
现在,每个与会者的孩子都会逐一抓住名字和对象ID。函数完成后,我将每个值存储到字典中。执行此操作时,此函数被多次调用,并且可能非常慢,尤其是在多次往返数据库时。有没有更有效的方法来做到这一点?我试图调查func getAttendees(child: NSString, completion: (result: Bool, name: String?, objectID: String?) -> Void){
var attendeesReference = self.eventsReference.childByAppendingPath((child as String) + "/attendees")
attendeesReference.observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) -> Void in
//Get the name/object ID of the attendee one by one--inefficient?
let name = snapshot.value.objectForKey("name") as? String
let objectID = snapshot.value.objectForKey("objectID") as? String
if snapshot != nil {
println("Name: \(name) Object ID: \(objectID)")
completion(result: true, name: name, objectID: objectID)
}
}) { (error) -> Void in
println(error.description)
}
}
,但这似乎会返回FEeventType.Value
孩子中的所有内容,而我真正想要的只是每个attendees
和name
objectID
存储到某种字典中。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:10)
Firebase的一个重要规则是只在您想要检索所有数据时才嵌套数据。此规则的原因是Firebase始终返回完整节点。您无法部分检索该节点中的某些数据,也无法检索其他数据。
Laravel 5.1 doc,对此有所说明:
因为我们可以将数据深度嵌套到32级,所以很容易认为这应该是默认结构。但是,当我们在数据库中的某个位置获取数据时,我们还会检索其所有子节点。因此,在实践中,最好尽量保持平坦,就像构建SQL表一样。
你应该真正阅读文档的整个部分,因为它包含一些非常好的例子。
在您的情况下,您需要修改数据结构以将事件参与者与事件元数据分开:
events
-JFSDFHdsf89498432
eventCreator: "Stephen"
eventCreatorId: 1764137
-JOeDFJHFDSHJ14312
eventCreator: "puf"
eventCreatorId: 892312
event_attendees
-JFSDFHdsf89498432
-JSAJKAS75478
name: "Johnny Appleseed"
-JSAJKAS75412
name: "use1871869"
-JOeDFJHFDSHJ14312
-JaAasdhj1382
name: "Frank van Puffelen"
-Jo1asd138921
name: "use1871869"
这样,您可以在不检索与会者的情况下检索事件元数据,反之亦然。