Cloud Firestore查询 - 您只能对null执行相等比较

时间:2018-02-25 19:43:39

标签: java android firebase google-cloud-firestore

我正在尝试通过在Cloud Firestore中存储代表最小纪元的值来创建动态查询。我们将此值称为“filter_value”:

enter image description here

我通过从.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”的民意调查。

enter image description here

我使用以下内容查询:

        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)

1 个答案:

答案 0 :(得分:1)

您没有显示其余代码,但我怀疑您是在构建查询而不等待快照侦听器回调完成。方法addSnapshotListener是异步,这意味着它在结果准备好之前立即返回。你必须为此做好计划。这意味着在该值可用之前,您不应继续使用依赖于filterEpochValue的查询。它第一次出现在你的回调中,所以你应该在那里开始查询。

Please read here有关Firebase API异步以及对它们的期望的更多信息。