【问题标题】:iOS - Firebase Filter queryiOS - Firebase 过滤器查询
【发布时间】:2017-01-25 11:31:40
【问题描述】:

我在 Firebase 中获得了分数节点:

在 score 节点下,我的数据结构如下:

{
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-Kak6FCyGtdy_kcEPd4K" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-Kak6FCyGtdy_kcEPd4K";
    score = 5;
};
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-KbE_pgfUsukOm4uW0bx" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-KbE_pgfUsukOm4uW0bx";
    score = 4;
};

问题: 我可以按分数过滤数据吗?

我试过了:

FIRDatabase.database().reference().child("scores").queryOrdered(byChild: "score").observeSingleEvent(of: .value, with: { (snapshot) in

        debugPrint(snapshot.value ?? "nil")

    })

但不能得到结果?

【问题讨论】:

  • 您可以使用 orderByChild 按数据过滤,但我认为您的问题是因为您输入了相应的内部有分数的节点。因为你是在小时候开始输入分数,但首先你需要输入你的每个id。
  • 有什么问题? debugPrint 会被调用吗?
  • @MagoNicolasPalacios:我的节点设置如图 1 所示?你能推荐一下吗?
  • @FrankvanPuffelen:是的,调用了调试打印,但数据未按分数排序
  • 但是你明白我说的吗?您正在输入分数,然后按分数过滤,并且分数没有直接的子节点,名为分数,它有 2 个不同的子节点,其中有一个称为分数的值。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

当您对 Firebase 执行查询时,您会得到一个 FIRDataSnapshot,其中包含每个结果的三条信息:

  • 它的钥匙
  • 它的价值
  • 它相对于其他节点的位置

当您调用snapshot.value 时,快照将转换为字典。不幸的是,该字典只能保存键值对,因此您会丢失有关节点位置的信息。因此,虽然快照中的数据实际上已正确排序,但您正在丢弃这些信息。

解决方案是使用FIRDataSnapshots 内置的children 属性以正确的顺序循环遍历子节点。 Firebase documentation on querying 提供了如何执行此操作的示例:

_commentsRef.observeEventType(.Value, withBlock: { snapshot in
  for child in snapshot.children {
    ...
  }
})

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2018-08-04
    • 1970-01-01
    相关资源
    最近更新 更多