You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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());
        }
    }
});

关键说明

  1. snapshot.isEmpty():这是判断查询是否返回数据的核心方法,直接检查快照里的文档数量是否为0。
  2. 移除document.exists()判断:因为QuerySnapshot里的QueryDocumentSnapshot都是已存在的有效文档,这个判断是多余的。
  3. 补充失败分支:当查询因网络、权限等原因失败时,能给用户明确的反馈,也方便开发者排查问题。

内容的提问来源于stack exchange,提问作者Sami Nazari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:37:58