【问题标题】:Chances of Firestore Failing a QueryFirestore 查询失败的可能性
【发布时间】:2026-02-13 15:25:01
【问题描述】:

我正在尝试构建一个基于个人资料的应用程序,其中用户信息存储在一个单独的集合中,其中 userID 作为 documentID

UserInfo/userID

用户 ID 存储在另一个集合中

Users/ramdomDocID

这里的每个文档都包含一个用户的uuiduserID等字段,没有重复具有相同uuid的文档用户 ID

身份验证成功后,我从 FirebaseUser 获取 uuid,然后查询 Users 集合中的 uuid 并然后从结果中读取 userID,如果查询返回 0 个文档,那么我创建一个新的配置文件并在两个集合中添加相关数据。

问题是 Firestore 查询有时会失败并返回 0 个文档,现在它返回 0 并且我创建新用户,并且现在忽略旧用户信息在数据库上创建重复项。

这是我的代码,我做错了吗?

 usersCollectionRef.whereEqualTo("uuid", uuid).get()
        .addOnCompleteListener { result ->
            if (result.isSuccessful && !result.result?.isEmpty!!) {
                for (document in result.result?.documents!!) {
                    getUserListener.onCompleteListener(document.toObject<UserModel>())
                }
            } else {
                getUserListener.onCompleteListener(null)
            }
        }
        .addOnFailureListener { exception ->
            getUserListener.onFailureListener(exception.message)
        }

更新:我还禁用了 Firestore 持久性

val firestore = Firebase.firestore
val settings = firestoreSettings {
    isPersistenceEnabled = false
}
firestore.firestoreSettings = settings

Firestore 是否有可能导致查询失败,尽管在我的情况下它发生 100 次中有 5 次

任何建议将不胜感激

【问题讨论】:

  • 这里不涉及概率。该操作要么有效,要么无效。回调会告诉你发生了什么。如果你不等待结果,还不确定结果会是什么。

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

你可以使用

.addOnSuccessListener { result ->
    //do your stuff
}
.addOnFailureListener { exception ->
    //handle exception
}

.addOnCompleteListener { result ->
    if (result.isSuccessful && !result.result?.isEmpty!!) {
        for (document in result.result?.documents!!) {
            getUserListener.onCompleteListener(document.toObject<UserModel>())
        }
    } else {
        getUserListener.onCompleteListener(null)
    }
}

并删除您的

.addOnFailureListener { exception ->
    getUserListener.onFailureListener(exception.message)
}

如果你没有处理你的 onFailureListener 可能是个问题

【讨论】:

  • 感谢您的回答,我会尝试改进那部分代码,看看它是否还在发生