【问题标题】:Cloud Firestore Query - You can only perform equality comparisons on nullCloud Firestore 查询 - 您只能对 null 执行相等比较
【发布时间】:2018-02-25 19:43:39
【问题描述】:

我正在尝试通过在 Cloud Firestore 中存储一个代表最小 Epoch 的值来创建动态查询。我们称这个值为“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());
            }
        }
    });

我已记录该值并确认已成功读取。

然后我有一个投票集合,每个投票都有一个时代。我想使用上面的 filter 变量根据它们各自的 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)

【问题讨论】:

  • filterEpochValue的数据类型是什么?在构建查询之前立即记录它的价值是什么?
  • 记录为75000
  • 至于类型,我必须检查一下,但我将其转换为 Long 以希望与每个投票中存储的内容进行比较。不确定 Firebase 添加后如何呈现。
  • 为了清楚起见,我要求的不是您在 Firestore 回调中显示的日志值,而是在您开始构建查询之前。我怀疑它是空的。
  • 刚查了一下,确实是null。试图找出原因,因为它在 .addSnapShotListener() 中不为空

标签: java android firebase google-cloud-firestore


【解决方案1】:

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

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

【讨论】:

  • 你是对的 - 这正是正在发生的事情。有没有办法添加完成回调来保证结果?
  • 或者回调是 .onEvent() 中的所有内容?
  • onEvent 回调。在那里做你需要做的事情,或者调用另一个函数。
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2018-03-20
  • 2020-05-06
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多