Firebase Firestore返回空QuerySnapshot但库中有数据,是什么原因?
排查步骤
- 检查Firebase安全规则配置
默认新建的Firestore数据库会限制未授权访问,若你未集成Firebase Auth登录逻辑也没有修改安全规则,读取请求会被官方拦截,返回空快照。开发阶段可临时使用测试规则验证(上线前必须调整为符合业务安全要求的规则):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.time < timestamp.date(2024, 12, 31); } } }
- 核对集合、字段名称拼写
Firestore的集合、文档、字段名称均大小写敏感,检查代码中写的集合名final是否和控制台中的集合名完全一致,没有大小写差异、多余空格或者拼写错误。同时确认final集合下的文档字段名是否和FirebaseModel中的属性名完全匹配,没有大小写偏差。 - 确认文档为有效存储文档
如果控制台中final集合下的文档名称为斜体显示,说明该文档是没有存储任何字段的虚拟父文档,仅用来承载子集合,这类文档不会被集合查询返回。需要确保你存储的文档都正常写入了image、title、detail三个字段。 - 检查Firebase项目配置是否匹配
确认你项目中引入的google-services.json文件和你存储数据的Firebase项目为同一个,若配置了其他项目的json文件,会连接到没有数据的空库导致查询为空。 - 增加错误日志定位问题
你当前的代码没有处理FirebaseFirestoreException错误参数,添加错误打印即可快速定位问题根源:
database.collection("final") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) { // 新增错误处理逻辑 if (error != null) { Log.w("TAG", "数据监听失败", error); return; } assert value != null; Log.d("TAG", "onEvent: "+ value.isEmpty()); models.clear(); for (DocumentSnapshot snapshot : value.getDocuments()){ FirebaseModel model = snapshot.toObject(FirebaseModel.class); assert model != null; models.add(model); } adapter.notifyDataSetChanged(); } });
打印的错误日志会直接告知你是权限不足、路径不存在还是其他配置问题。
内容的提问来源于stack exchange,提问作者Mujadid Bukhari
相关产品推荐
相关产品推荐

