对于我的应用程序,我实现了一个过滤器选项。我使用火箭筒
Query
使用所述过滤器进行查询。以下是实施:
private void loadDestinations() {
Query query = App.getFirestore().collection("destinations");
if (mFilters.hasCountry()) {
query = query.whereEqualTo(Destination.FIELD_COUNTRY, mFilters.getCountry());
}
if (mFilters.hasPrice()) {
query = query.whereEqualTo(Destination.FIELD_PRICE, mFilters.getPrice());
}
if (mFilters.hasSortBy()) {
query = query.orderBy(mFilters.getSortBy(), mFilters.getSortDirection());
}
query.addSnapshotListener((documentSnapshots, e) -> {
if (documentSnapshots != null) {
if (!documentSnapshots.isEmpty()) {
Log.d(LOG_TAG, "Snapshots are not null and have value");
List<Destination> destinationList = documentSnapshots.toObjects(Destination.class);
mDestinations.setValue(destinationList);
} else {
Log.d(LOG_TAG, "Snapshots are not null but have no value");
mDestinations.setValue(new ArrayList<>());
}
} else {
Log.e(LOG_TAG, "Snapshots are NULL!");
mDestinations.setValue(new ArrayList<>());
}
});
}
看看第二行,我在其中实例化
query
对象然后,我对用户添加的每种类型的过滤器(国家、价格、排序)进行复合。
现在,如果我将国家/地区和价格组合在一起,这将非常好地加载,但只要我添加排序aka
query.orderBy()
这个
documentSnapshots
第17行返回null。更奇怪的是,如果使用复合查询,snapshotListener会检索两次数据。第一次记录时:
快照不为null且具有值
然后立即记录
快照为空!
即使
loadDestinations()
方法被调用了一次(我检查了)。
我可以肯定的是,大约一个月前,这不是一个问题,因为那时我开发了这个部分并测试了它。但现在,出于原因,它正以这种方式行事。API是否有任何重大变化?代码有故障吗?
额外费用:
比如,在第2行,我添加了另一个
.whereEqualTo()
像这样:
Query query = App.getFirestore().collection("destinations").whereEqualTo("approved", true);
侦听器将返回空值,只添加一个过滤器(而不是之前的两个过滤器)。我之所以提到这一点,是因为我认为这与数据的排序方式无关,更重要的是,复合查询不起作用。出于某种原因,它会再次重试,直到为null。我也不认为这是关于创建索引的,因为我一个月前就已经这样做了。此外,它会在日志中提到同样多的内容。