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索引虽然功能强大,但在这种情况下无济于事。
答案 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数据库,非规范化也是正常的。所以不要害怕复制数据。