如何判断Firestore QuerySnapshot中是否存在数据?代码问题排查
解决Firestore查询无数据时无响应的问题
我来帮你排查这个问题——你的代码逻辑有个小漏洞,导致数据不存在时没触发预期的提示。
问题根源
你当前的代码是在遍历查询到的每个文档时判断document.exists(),但如果查询结果里完全没有匹配ordered: false的文档,这个for循环根本不会执行,所以里面的else分支自然永远不会运行。另外,你也没处理查询失败的场景(比如网络错误、权限不足),这也是一个潜在问题。
修复方案
调整代码逻辑,先判断整个查询结果是否为空,再处理存在的文档,同时补充查询失败的处理分支:
CollectionReference reference = firestore.collection("Carts") .document(FirebaseAuth.getInstance().getCurrentUser().getUid()) .collection("Carts"); reference.whereEqualTo("ordered", false).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { QuerySnapshot snapshot = task.getResult(); // 先判断查询结果是否为空 if (snapshot.isEmpty()) { // 没有匹配的数据 Toast.makeText(ListProducts.this, "NOPE", Toast.LENGTH_SHORT).show(); } else { // 遍历所有匹配的文档 for (QueryDocumentSnapshot document : snapshot) { // 这里的document肯定是存在的,无需再判断document.exists() Toast.makeText(ListProducts.this, "Exists", Toast.LENGTH_SHORT).show(); // 可以在这里处理文档数据,比如获取字段:String data = document.getString("fieldName"); } } } else { // 处理查询失败的情况 Toast.makeText(ListProducts.this, "查询失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); Log.e("FirestoreError", "查询出错", task.getException()); } } });
关键说明
snapshot.isEmpty():这是判断查询是否返回数据的核心方法,直接检查快照里的文档数量是否为0。- 移除
document.exists()判断:因为QuerySnapshot里的QueryDocumentSnapshot都是已存在的有效文档,这个判断是多余的。 - 补充失败分支:当查询因网络、权限等原因失败时,能给用户明确的反馈,也方便开发者排查问题。
内容的提问来源于stack exchange,提问作者Sami Nazari
相关产品推荐
相关产品推荐

