更有效的方式来检索Firebase数据?

我有一个分层的数据集,我想从Firebase中检索信息。 以下是我的数据看起来如何: 在这里输入图像说明

但是,我的问题是这样的:在查看数据的结构如何,当我想要获取attendeenameobject 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) } } 

现在,每个参与者的孩子都要经过一个一个的抓取名字和对象ID。 当函数完成时,我将每个值存储到一个字典中。 一旦这样做,这个函数被多次调用,而且可能非常慢,尤其是在数据库往返数次的时候。 有没有更有效的方法来做到这一点? 我试图去查看FEeventType.Value但是这似乎返回attendees孩子的一切,当我真正想要的是每个attendeenameobjectID存储到某种字典。 任何帮助,将不胜感激。 谢谢!

Firebase的黄金规则之一就是在您始终想要检索所有数据时才embedded数据 。 这个规则的原因是Firebase总是返回一个完整的节点。 您不能部分检索该节点中的某些数据,而不能检索其他数据。

关于构build数据的Firebase指南对此进行了说明:

因为我们可以将数据嵌套到32层深处,所以很容易认为这应该是默认的结构。 但是,当我们在数据库中的某个位置获取数据时,我们还检索了它的所有子节点。 因此,在实践中,最好尽可能保持平坦,就像构buildSQL表一样。

你应该真的阅读整个文档,因为它包含了一些很好的例子。

在你的情况下,你需要修改你的数据结构来分隔事件参与者和事件元数据:

 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" 

这样,您可以检索事件元数据而不检索与会者,反之亦然。

Interesting Posts