我正在尝试通过在Cloud Firestore中存储代表最小纪元的值来创建动态查询。我们将此值称为“filter_value”:
我通过从.onStart()
mStoreBaseRef.collection("epoch_filter").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot querySnapshot, FirebaseFirestoreException e) {
for (DocumentSnapshot z : querySnapshot){
Epoch epoch = z.toObject(Epoch.class);
filterEpochValue = (long) epoch.getFilter_value();
Log.v("X_VALUE", filterEpochValue.toString());
}
}
});
我已记录该值并确认已成功读取。
然后我有一个民意调查的集合,每个民意调查都有一个时代。我想使用上面的过滤器变量来根据各自的Epoch对这些民意调查执行查询,这样我才能查看大于我的“filter_value”的民意调查。
我使用以下内容查询:
Query queryStore = FirebaseFirestore.getInstance()
.collection("Polls")
.whereGreaterThan("epoch", filterEpochValue)
.orderBy("vote_count");
FirestoreRecyclerOptions<Poll> storeOptions = new FirestoreRecyclerOptions.Builder<Poll>()
.setQuery(queryStore, Poll.class)
.build();
并收到以下内容:
java.lang.IllegalArgumentException: Invalid Query. You can only perform equality comparisons on null (via whereEqualTo()).
at com.google.android.gms.internal.zzenx.zza(Unknown Source)
at com.google.firebase.firestore.Query.zza(Unknown Source)
at com.google.firebase.firestore.Query.whereGreaterThan(Unknown Source)
at com.troychuinard.fanpolls.Fragment.TrendingFragment.onStart(TrendingFragment.java:181)
at android.support.v4.app.Fragment.performStart(Fragment.java:2287)
答案 0 :(得分:1)
您没有显示其余代码,但我怀疑您是在构建查询而不等待快照侦听器回调完成。方法addSnapshotListener是异步,这意味着它在结果准备好之前立即返回。你必须为此做好计划。这意味着在该值可用之前,您不应继续使用依赖于filterEpochValue
的查询。它第一次出现在你的回调中,所以你应该在那里开始查询。
Please read here有关Firebase API异步以及对它们的期望的更多信息。