如何按两个字段对 Firebase 记录进行排序(Android)[重复]
Posted
技术标签:
【中文标题】如何按两个字段对 Firebase 记录进行排序(Android)[重复]【英文标题】:How to sort Firebase records by two fields (Android) [duplicate] 【发布时间】: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 的更多信息。 【参考方案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。你可以编辑你的答案,或者只是添加对另一个答案的引用,我接受吗?以上是关于如何按两个字段对 Firebase 记录进行排序(Android)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何按两个字段对 Firebase 记录进行排序(Android)[重复]
如何按字段值(即“原因”字段名称及其值可能是“垃圾邮件”、“裸露”等)对 Firebase Firestore 数据进行排序
如何在 Firebase 云 Firestore 中查询一个字段然后按另一个字段排序?