Firebase无法获取文档字段值 提示Download Failure如何解决
Firestore读取用户文档触发失败回调的排查方案
按优先级从高到低依次排查修复即可:
- 补全Firestore实例初始化
现有代码仅声明了private FirebaseFirestore db;,从未执行实例化操作,调用db.collection()时会直接抛出空指针,触发失败回调。在鉴权逻辑前加一行初始化代码:db = FirebaseFirestore.getInstance(); - 修复安全规则的两处致命错误
当前配置的安全规则完全无法正常生效,会直接拦截所有读写请求:- 缺少规则必填的数据库根路径匹配块,直接匹配
/Users/{userID}不会命中任何文档路径 - 路径变量名大小写不匹配:路径声明的变量为
userID(ID大写),权限判断里写的是userId(id小写),变量不一致会导致权限校验永远返回false
替换为以下正确规则即可:
注意:安全规则修改后最长需要1分钟左右完成同步,不要修改完立刻发起请求测试rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /Users/{userID} { allow read, write: if request.auth != null && request.auth.uid == userID; } } } - 缺少规则必填的数据库根路径匹配块,直接匹配
- 不要吞掉失败回调的异常信息
现有失败回调仅打印固定文案,无法定位具体报错原因,修改为打印完整异常栈,后续出现问题可以直接从日志看到根因:.addOnFailureListener(e -> { Log.e(TAG, "Download Failure", e); }) - 修正字符串比对的错误写法
验证用户ID时使用==比对字符串是Java常见错误,==比对的是对象内存地址而非内容,即使两个字符串文本完全一致也可能返回false,内容比对请用以下写法:TextUtils.equals(currentUser.getUid(), "vfS6yOAJsjR49eWcXOeIvZCulJl2") - 异步调用注意事项
documentRef.get()是异步网络请求,不要在addOnSuccessListener外层代码直接读取json变量,回调触发前json会一直为null,所有依赖stockList字段值的逻辑,必须全部写在onSuccess回调内部。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

