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

Posted

技术标签:

【中文标题】检索 Firebase 数据的更有效方法?【英文标题】:More efficient way to retrieve Firebase Data? 【发布时间】:2015-07-09 00:02:05 【问题描述】:

我有一组分层数据,我想从 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 孩子中的所有内容,而我真正想要的只是每个attendee 中的nameobjectID 存储到某种字典中。任何帮助,将不胜感激。谢谢!

【问题讨论】:

在下面回答,但下次请以文本格式包含数据。这样我就可以简单地修改它,而不是花时间输入数据。 【参考方案1】:

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

Firebase guide on structuring data 是这么说的:

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

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

【讨论】:

您好,抱歉,给您造成的混乱以及您必须做的额外输入,我深表歉意。我想我明白你在说什么。但是,我只有一个相关的问题:当我想检索活动参与者信息时,我必须指定活动的键。例如,我需要在我的 Firebase 引用路径中指定 JFSDFHdsf89498432 以获取活动参与者。我怎么知道指定哪个是正确的键来获取正确的数据? 出于这个特定原因,我在eventsevent_attendees 下使用了相同的ID。因此,要获取活动元数据,您需要 ref.child('events').child(eventId).on('value' 并获取同一活动的参与者 ref.child('event_attendees).child(eventId).on('child_added' 啊,我明白了。非常感谢你。除了可能在创建事件后立即保留一个单独的数组并存储在eventId 中之外,还有什么方法可以按照您在上述评论中的建议跟踪eventId 您好 Frank van Puffelen,我有一个问题。当我调用FEventType.ChildAdded 时,如果我没记错的话,我最终会一次抓取一个子节点。有没有办法同时抓取每个子节点?例如,在上面的问题中,我想同时获取子 JSAJKAS75478JSAJKAS75412 中的内容并将其存储到一个大数组中。我知道如果我这样做 FEventType.Value 将抓住该子节点的每个与会者,但如果我没记错的话,我最终也会得到参考 JSAJKAS75478JSAJKAS75412 @FrankvanPuffelen 你好。我最近问了一个问题,但很遗憾没有得到满意的答复。如我所见,您还包括了活动参与者的姓名。这是一个好习惯吗?如果用户决定更改他/她的姓名怎么办?这意味着您必须更新该用户的所有 event_attendees 子项。谢谢。

以上是关于检索 Firebase 数据的更有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从firebase数据中检索数据短片

检索 Azure VM 的公共 IP 地址的更简单方法

使用 Alamofire 从 Firebase 检索 JSON

从 Fire Storage 检索图像,但是如果图像不存在,则应用程序崩溃

Firebase 实时数据库能否有效地循环浏览数十亿条帖子并由发布它们的用户检索?

RecycleView 不从 Google Firestore 检索数据