一尘不染

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

swift

我有一组层次结构的数据,我想从Firebase检索信息。以下是我的数据的外观:在此处输入图片说明

但是,我的问题是这样的:在查看数据的结构时,当我想抓取nameobject idattendee,必须执行以下代码:

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的孩子,当我真正想要的是nameobjectID每个attendee存储成某种字典。任何帮助,将不胜感激。谢谢!


阅读 261

收藏
2020-07-07

共1个答案

一尘不染

Firebase的黄金法则之一是 仅在您始终想检索所有数据时嵌套您的数据
。此规则的原因是Firebase始终返回完整的节点。您不能部分检索该节点中的某些数据,而不能部分检索其他数据。

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

因为我们可以嵌套多达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"

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

2020-07-07