使用FirestoreRecyclerAdapter建立索引查询

时间:2018-02-12 21:53:09

标签: android android-recyclerview google-cloud-firestore firebaseui

FirebaseUI-Android在使用FirebaseRecyclerAdapter时提供索引查询。这在访问Firebase Realtime DB数据时效果很好,如下所述:https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md#using-firebaseui-with-indexed-data

但访问Firestore数据怎么样?似乎FirestoreRecyclerAdapter不支持通过setIndexedQuery(keyref, dataref, ...编制索引的查询。我怎样才能在RecyclerView内手动执行数据查询?

更新:有几个人声称Firestore不再需要索引查询,因为内置索引使得架构设计比Firebase Realtime DB更容易。好吧,我不同意。

假设我有一堆相关的交易,我想按项目和交易进行查询。

我无法将交易作为项目的子集合,因为这将无法检索所有交易的列表。我也无法将项目数据复制为每个事务中的冗余字段,因为数据是可变的。

考虑到这些限制,我坚持将项目和交易作为两个独立的集合,需要在应用程序内再次组合:

items: {
        "item1": {
                  "name": "some editable label",
                  [more fields]
                 }

transactions: {
               "trans1": {
                          "itemid": "item1"
                          [more fields]
                         }
               "trans2": {
                          "itemid": "item1"
                          [more fields]
                         }
              }

FirebaseRecyclerAdapter.setIndexedQuery允许我检索每个事务(数据)的事务列表(键)和相应的项记录。 Firestore索引虽然功能强大,但在这种情况下无济于事。

1 个答案:

答案 0 :(得分:1)

setIndexedQuery()类下面没有FirestoreRecyclerOptions方法,因为不需要这样的方法。来自offical documentation regarding indexes

  

Cloud Firestore需要为每个查询提供索引,以确保获得最佳性能。所有文档字段都自动编制索引,因此仅使用相等子句的查询不需要其他索引。

如果您需要使用多个propoerty的查询,则需要从Firebase控制台手动创建新索引。 Firestore尚不支持以编程方式创建索引。

修改

  

我无法将交易作为项目的子集合,因为这将无法检索所有交易的列表。

这是正确的,文档下面的集合或文档下面没有集合。但是你可以使用以下结构:

Collection -> Document -> Collection

但请记住,使用嵌套集合和文档现在是Firestore中的常见做法。假设您transactions下面有items。在Firebase实时数据库中,如果您有一个嵌套在另一个对象中的对象,那么每次您想要查询数据库以仅显示项目时,enitire Items对象将与{{1}一起下载对象,结束花更多带宽。但是当涉及收藏和文件时,情况就不再如此了。

我不了解您的应用的用例,因为那里的信息较少,但Cloud Firestore更容易在集合和文档之间创建关系。如果您有时间,可以查看我的tutorials之一,了解如何创建Firestore数据库结构。

即使您使用的是Firebase Realtime数据库或Cloud Firestore数据库,非规范化也是正常的。所以不要害怕复制数据。