如果没有匹配的查询文档,则不会调用任何 Firestore 任务处理程序

Non of the Firestore task handlers are being called if there is no matching document for query

我正在使用一个简单的代码来检查是否存在包含指定电子邮件地址的文档。但是,如果电子邮件不存在并且没有匹配的文档,则 addOnCompleteListeneraddOnSuccessListneraddOnFailureListener 都不会被调用。

val db = Firebase.firestore

db.collection("Users").whereEqualTo("email", "nonexisting@example.com").get()
        .addOnSuccessListener {  QuerySnapshot ->
            Log.d(TAG, "${QuerySnapshot.documents.size}")
        }
        .addOnCanceledListener {
            Log.d(TAG, "Request was canceled!")
        }
        .addOnFailureListener { exception ->
            Log.d(TAG, "$exception")
        }
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                for (document in task.result) {
                    Log.d(TAG, "${document.id}")
                }
            } else {
                Log.d(TAG, "Error getting documents: ", task.exception)
            }
        }

据我所知,这不是预期的行为。我在这里遗漏了什么吗?

我使用以下作为依赖项:

implementation platform('com.google.firebase:firebase-bom:29.0.0')
implementation 'com.google.firebase:firebase-firestore-ktx'

更新:

我试过 bom:29.1.0 仍然是同样的行为,我确实有互联网,像 add() 这样的突变工作正常

当您的查询没有结果时,addOnFailureListener 不会被触发,因为缺少某些文档不会被视为异常。但是,如果您的查询由于安全规则不当而被拒绝,那么肯定会抛出异常。

你说当你的查询没有 return 任何文档时也不会触发 addOnCompleteListener。但我对此表示怀疑,因为你说 add() 工作正常,这意味着你在用户设备上有互联网连接。很可能它被触发了,但你不知道。为什么?因为你不处理那个案子。

如果您没有得到任何结果,addOnCompleteListener 确实会触发,这意味着 task.isSuccessful return 是正确的。这也意味着不会评估 else 部分。由于没有文档,for-each 循环不会打印任何内容。您拥有的最佳选择是检查文件是否存在:

.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        for (document in task.result) {
            if(document.exists()) {
                Log.d(TAG, "${document.id}")
            } else {
                Log.d(TAG, "Document doesn't exist.")
            }
        }
    } else {
        Log.d(TAG, "Error getting documents: ", task.exception)
    }
}