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

时间:2015-07-09 00:02:05

标签: ios swift firebase firebase-realtime-database hierarchical-data

我有一组分层数据,我想从Firebase检索信息。以下是我的数据显示方式:enter image description here

但是,我的问题是:在查看数据结构的方式时,当我想抓住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孩子中的所有内容,而我真正想要的只是每个attendeesname objectID存储到某种字典中。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 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"

这样,您可以在不检索与会者的情况下检索事件元数据,反之亦然。