我正在使用一個簡單的代碼來檢查是否存在包含指定電子郵件地址的檔案。但是,如果電子郵件不存在并且沒有匹配的檔案,則既不會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()作業正常
uj5u.com熱心網友回復:
當您的查詢沒有結果時,addOnFailureListener不會被觸發,因為某些檔案的缺失不會被視為例外。但是,如果您的查詢由于不正確的安全規則而被拒絕,那么肯定會拋出例外。
您說addOnCompleteListener當您的查詢不回傳任何檔案時也不會觸發。但我對此表示懷疑,因為您說add()效果很好,這意味著您在用戶設備上有互聯網連接。很可能它已被觸發,但您不知道。為什么?因為你沒有處理那個案子。
如果你沒有得到任何結果,addOnCompleteListener確實會觸發,這意味著task.isSuccessful回傳 true。這也意味著不會評估 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)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441455.html
上一篇:如何追加到1個資料
