代码之家  ›  专栏  ›  技术社区  ›  user158

如果没有匹配的文档可供查询,则将调用非Firestore任务处理程序

  •  0
  • user158  · 技术社区  · 4 年前

    我使用一个简单的代码来检查是否存在包含指定电子邮件地址的文档。但如果电子邮件不存在,也没有匹配的文档 addOnCompleteListener 或 addOnSuccessListner 或 addOnFailureListener 没有接到电话。

    val db = Firebase.firestore
    
    db.collection("Users").whereEqualTo("email", "[email protected]").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() 工作良好

    0 回复  |  直到 4 年前
        1
  •  2
  •   Alex Mamo    4 年前

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

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

    如果没有结果, addOnCompleteListener 确实发生了火灾,这意味着 task.isSuccessful 返回true。这也意味着不会对其他部分进行评估。由于没有文档,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)
        }
    }