You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:02:42