当前位置: 首页 > 面试题库 >

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

云育
2023-03-14
问题内容

我有一组层次结构的数据,我想从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存储成某种字典。任何帮助,将不胜感激。谢谢!


问题答案:

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"

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



 类似资料:
  • 问题内容: 我正在法国学习,所以很难找到法语教程来解决我的问题。因此,我不得不问我的问题,希望有一个令人满意的解决方案。 我的问题是我在firebase上读取数据时遇到了麻烦,并且花了三天时间。 我有这样的结构: 我已经开始编写一些代码,可以恢复密钥,但是无法恢复这些值“ nom”,“ argent”等。 问题答案: John的替代方法是使用来获取每个属性:

  • 我正在两个标记之间画一条路线,我想保存那条路线。为此,我将包含lat和lng的ArrayList保存在Firebase数据库中。但我在取回航路点时遇到了问题。我是这样插入的: 在检索数据时,我尝试执行以下操作:

  • 问题内容: 我对选择两种方法感到困惑。 方案 有两个表,并分别。包含用户数据,例如名字,姓氏等 包含每个用户拥有的汽车及其说明。即,等等 现在,如果我想获得所有用户的所有信息,那么哪种方法最好在最短的时间内完成? 方法1。 查询其中的所有行,并将它们全部存储在ex的列表中。 然后循环浏览列表并对其进行查询,并根据第一步中保存的用户从中获取数据。 方法2 查询所有行,并在保存该行时从中获取所有值并保

  • 这是我的第二个版本,我试图从Firebase检索代码,并用它做一些事情。这是我的第二种方式: 这将崩溃,并出现错误代码: 未能将类型“__NSCFString”(0x10A77F4A0)的值强制转换为“NSDictionary”(0x10A780288)。在“更新”行。这是我的第一次尝试: 打印更多数据: -路径通道引用:可选(https://x.com/channels/-kegkajavh6u

  • 我试图显示一个零件的"loc",如果它的零件号我给。以下是数据结构的样子: 活动代码: getLoc是Product类的getter函数,它返回给定curP对应的“loc”。curP部分表示子值。 逻辑对我来说似乎是正确的,但我没有得到输出。我哪里出了问题?