检索 Firebase 数据的更有效方法?
Posted
技术标签:
【中文标题】检索 Firebase 数据的更有效方法?【英文标题】:More efficient way to retrieve Firebase Data? 【发布时间】:2015-07-09 00:02:05 【问题描述】:我有一组分层数据,我想从 Firebase 检索信息。下面是我的数据的样子:
但是,我的问题是:查看数据的结构后,当我想获取attendee
的name
或object 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
中的name
和objectID
存储到某种字典中。任何帮助,将不胜感激。谢谢!
【问题讨论】:
在下面回答,但下次请以文本格式包含数据。这样我就可以简单地修改它,而不是花时间输入数据。 【参考方案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
以获取活动参与者。我怎么知道指定哪个是正确的键来获取正确的数据?
出于这个特定原因,我在events
和event_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
时,如果我没记错的话,我最终会一次抓取一个子节点。有没有办法同时抓取每个子节点?例如,在上面的问题中,我想同时获取子 JSAJKAS75478
和 JSAJKAS75412
中的内容并将其存储到一个大数组中。我知道如果我这样做 FEventType.Value
将抓住该子节点的每个与会者,但如果我没记错的话,我最终也会得到参考 JSAJKAS75478
和 JSAJKAS75412
。
@FrankvanPuffelen 你好。我最近问了一个问题,但很遗憾没有得到满意的答复。如我所见,您还包括了活动参与者的姓名。这是一个好习惯吗?如果用户决定更改他/她的姓名怎么办?这意味着您必须更新该用户的所有 event_attendees 子项。谢谢。以上是关于检索 Firebase 数据的更有效方法?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Alamofire 从 Firebase 检索 JSON
从 Fire Storage 检索图像,但是如果图像不存在,则应用程序崩溃