Android端Cloud Firestore如何使用逻辑AND查询并正确添加计数到数组
问题根因
两个问题的诱因非常明确:
- Firestore的
get()是异步非阻塞操作,调用后会立刻执行后续的同步代码,不会等待查询结果返回。你写在addOnSuccessListener外部的man.add()执行时,查询还没拿到结果,c始终是初始值0,自然无法存入正确计数。 - Firestore链式调用多个
whereEqualTo时,默认就是按逻辑AND叠加所有筛选条件,不需要额外写AND语法。你觉得ctrApproved2、ctrApproved的空值筛选没生效,本质是匹配值和文档实际存储值不匹配:如果文档里这两个字段存的是null、或者字段本身不存在,用whereEqualTo(字段名, "")(匹配空字符串)是无法命中的,最终结果看起来就像只生效了m字段的筛选条件。
修复后代码
obj.setUid(d.getId().toString()); db.collection("individuals") .whereEqualTo("m", obj.getUid()) // 若文档中对应空值为null,将第二个参数从""替换为null即可,null条件可同时匹配字段值为null、字段不存在的文档 .whereEqualTo("ctrApproved2", "") .whereEqualTo("ctrApproved", "") .get() .addOnSuccessListener(queryDocumentSnapshots -> { int c = queryDocumentSnapshots.size(); Log.d("Length", String.valueOf(c)); // 所有依赖查询结果的逻辑必须放在回调内部执行,此时拿到的c才是真实的符合条件的文档数 man.add(obj.getUid() + " (" + c + ")"); }) .addOnFailureListener(e -> { // 补充失败监听,方便快速定位权限、索引缺失类查询错误 Log.e("FirestoreQuery", "查询执行失败", e); });
关键提示
- 所有需要用到异步查询结果的逻辑,必须写在对应的成功回调内部,不要在回调外部使用回调内赋值的变量,这类变量的赋值时机晚于外部同步代码执行,永远拿不到最新值。
- 配置空值筛选前,先到Firestore控制台确认目标字段的实际存储值:空字符串
""和null是完全不同的匹配目标,传错参数就会导致筛选结果不符合预期。
内容的提问来源于stack exchange,提问作者Vikas Konaparthi
相关产品推荐
相关产品推荐

