【问题标题】:More efficient way to retrieve Firebase Data?检索 Firebase 数据的更有效方法?
【发布时间】: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 存储到某种字典中。任何帮助,将不胜感激。谢谢!

【问题讨论】:

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

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


【解决方案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 子项。谢谢。
猜你喜欢
  • 2020-09-06
  • 2017-03-19
  • 2011-12-03
  • 2021-01-24
  • 2016-06-06
  • 1970-01-01
  • 2020-07-07
  • 2014-02-03
  • 2017-01-06
相关资源
最近更新 更多