【问题标题】:How to sort Firebase records by two fields (Android) [duplicate]如何按两个字段对 Firebase 记录进行排序(Android)[重复]
【发布时间】:2021-11-23 21:41:04
【问题描述】:

我正在使用FirebaseRecyclerAdapter 并将FirebaseRecyclerOptions 与一些查询一起传递给构造函数。每个项目都有多个字段,包括时间戳a 和另一个整数字段b。因此,我希望具有较旧 a 但较少 b 的项目位于列表顶部。用 sqlite 很容易实现,但用 nosql 就不是那么容易了。看来我需要添加一些额外的字段来保留这两个字段: String.valueOf(a) + String.valueOf(b) 但是如何实现 asc / desc 属性?

加载整个列表并在 Java 中排序不是一种选择。

【问题讨论】:

  • 您似乎已经在实时数据库中找到了filter on multiple properties 的方法。没有让数据库反转结果的选项,但您可以:1) 在客户端反转它们,鉴于您已经通过网络连接加载所有数据,这是一个总是的选项, 2) 将反转值存储在数据库的属性中并对其进行排序。请参阅 this answer 以及来自 this list 的更多信息。

标签: android firebase firebase-realtime-database


【解决方案1】:

很遗憾,Firebase 实时数据库不支持对多个属性的查询,仅支持对单个子属性的查询。因此,您猜对了,您需要创建一个额外的字段来保留这两个字段。因此,要实现这一点,您需要创建一个新字段,该字段在您的数据库中应如下所示:

Firebase-root
   |
   --- itemId
          |
          --- a: valueOfA
          |
          --- b: valueOfB
          |
          --- a_b: valueOfA_valueOfB

如您所见,a_b 属性结合了您要过滤的值。

与 Firebase 实时数据库不同,Cloud Firestore 允许 compound queries。你应该看看这个。因此,Cloud Firestore 允许在不创建组合属性的情况下进行如下查询。

itemIdRef.whereEqualTo("a", "valueOfA").whereEqualTo("b", "valueOfB");

当您订购字符串时,这是正常的订购方法。一个快速的解决方法是在每个第二个元素之前添加两个零,如下所示:"1516428687_001"、"1516428687_002"、"1516428687_012"。现在你的订单会很好。更多解释请看我在post的回答。

【讨论】:

  • 问题是我实际上要求所有没有equalsTo但有订单的项目。在这种情况下,如果我只是连接两个字段,那么我将无法使用我在问题中提到的 ASC/DESC
  • 谈到 Firebase 实时数据库,是的,您可以,将新的 a_b 属性传递给 order 方法,如下所示:.orderBy("a_b")。
  • 我想过 - 但实际上它不会起作用,因为我猜 Firebase 在内部使用标准字符串比较器,因此三个键的顺序将遵循 "1516428687_1", "1516428687_12", "1516428687_2"。但我需要"1516428687_1", "1516428687_2", "1516428687_12"。你有更多的想法@alex-mamo?
  • 当您的订单字符串时,这是正常的订购方法。一个快速的解决方法是在每个第二个元素之前添加两个零,如下所示:"1516428687_001", `"1516428687_002", "1516428687_012"`。现在你的订单会很好。更多解释请看我here的回答。现在可以了吗?
  • 是的,这行得通,我实现了这种方法,但这种解决方法远非简单的解决方案。目前看来,firebase 严重缺乏 API。你可以编辑你的答案,或者只是添加对另一个答案的引用,我接受吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多