获取已存在文档时Cloud Firestore返回不存在结果的问题求助
排查Firestore存在文档却检索失败的问题
我来帮你梳理下可能的原因,你确定文档存在但拿不到数据,大概率是踩了这些常见的坑:
文档ID大小写不匹配:Firestore的文档ID是严格区分大小写的!比如你传入的是
"jtorrus123",但控制台里的文档ID是"JTorrus123",这就会直接找不到。先去Firebase控制台仔细核对文档ID的大小写是否完全一致。安全规则限制了读取权限:检查你的Firestore安全规则,是不是当前请求没有读取
Usuarios集合的权限。比如如果规则要求用户必须认证,但你的代码调用时用户还没完成登录,或者规则直接禁止了读取操作,都会导致请求失败。没处理失败回调,看不到错误信息:你的代码只处理了请求成功的情况,但如果请求失败(比如网络问题、权限不足),你完全不知道发生了什么。建议立刻加上失败处理逻辑,打印错误日志:
val db = FirebaseFirestore.getInstance() private fun retrieveUsersFromParticipantsId(participant: String) { db.collection("Usuarios").document(participant).get() .addOnCompleteListener { task -> if (task.isSuccessful) { val user = task.result.toObject(User::class.java) // 别用!!,避免空指针崩溃,用安全的let操作 user?.let { participantsArray.add(it) } } else { // 打印错误信息,这是排查问题的关键! Log.e("FirestoreDebug", "读取用户失败", task.exception) } } }
集合名称拼写错误:核对下代码里的集合名
"Usuarios"和Firebase控制台里的集合名称是不是完全一致,有没有少写字母、多写符号或者拼写错误(比如是不是应该是"Users"?)异步操作的时序问题:Firestore的
get()是异步执行的,如果你在调用retrieveUsersFromParticipantsId之后立刻去访问participantsArray,这时候数据还没加载完成,会误以为没拿到数据。必须在addOnCompleteListener的回调里处理后续逻辑,或者用协程来简化异步代码:
// 记得先添加Firestore协程依赖 private suspend fun retrieveUsersFromParticipantsId(participant: String) { val db = FirebaseFirestore.getInstance() try { val documentSnapshot = db.collection("Usuarios").document(participant).get().await() val user = documentSnapshot.toObject(User::class.java) user?.let { participantsArray.add(it) } } catch (e: Exception) { Log.e("FirestoreDebug", "读取用户失败", e) } }
建议你先按上面的方法加上错误日志,看看具体的失败原因,这是最快定位问题的方式!
内容的提问来源于stack exchange,提问作者JTorrus
相关产品推荐
相关产品推荐

