Android平台Firestore获取已认证用户数据及医生信息查询返回0的问题排查求助
解决Firestore查询
doctors集合返回0结果的问题 嘿,我来帮你排查这个问题!你提到查询doctors集合返回0条结果,还怀疑和认证相关,结合你说的文档都是用认证用户ID作为文档ID存储的情况,大概率是安全规则没有正确放行查询请求导致的,咱们一步步拆解解决:
1. 先检查你的Firestore安全规则
默认的Firestore安全规则是拒绝所有读写请求的(为了数据安全),如果你的规则没修改过,肯定会导致查询返回空。你需要根据需求调整规则,比如允许所有认证用户读取doctors集合的所有文档:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 允许已认证用户读取所有医生文档 match /doctors/{doctorId} { allow read: if request.auth != null; // 写规则可以按需调整,比如仅允许医生自己修改自己的文档 allow write: if request.auth != null && request.auth.uid == doctorId; } } }
如果你的需求是仅允许用户查看自己的医生文档,那可以把读规则改成:
allow read: if request.auth != null && request.auth.uid == doctorId;
2. 确保代码执行查询时用户已完成认证
如果用户还没登录,request.auth会是null,安全规则会直接拒绝请求。所以你需要在查询前先确认用户的认证状态:
// 先检查当前用户是否已认证 FirebaseAuth.getInstance().currentUser?.let { authenticatedUser -> // 用户已登录,执行查询 val query = fireStoreDbRef.collection(Constants.COLLECTION_DOCTORS) query.get() .addOnSuccessListener { snapshot -> Log.d("TAG", "getAllDoctors: ${snapshot.size()}") // 这里可以处理获取到的医生数据 } .addOnFailureListener { exception -> Log.e("TAG", "查询医生数据失败: ${exception.message}") } } ?: run { // 用户未登录,提示或引导登录 Log.d("TAG", "用户未认证,无法获取医生信息") }
3. 排查其他可能的小问题
- 检查
Constants.COLLECTION_DOCTORS的字符串是否和Firestore控制台里的集合名完全一致(Firestore对大小写敏感,别拼错了) - 用Firestore控制台的规则模拟器测试:在控制台的「规则」标签页,模拟一个已认证用户的读取请求,看看是否被规则允许,能快速定位规则是否存在问题
内容的提问来源于stack exchange,提问作者Yazdan Ilyas
相关产品推荐
相关产品推荐

