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

Android Firestore店铺收藏功能else代码块未执行问题求助

问题原因分析及修复方案

嘿,我一眼就看出问题所在啦!你的代码逻辑里有个关键误区:Firestore的get()查询只要能正常完成(哪怕没查到任何匹配的文档),task.isSuccessful()都会返回true。只有当查询本身抛出错误(比如网络问题、权限不足)的时候,才会进入else分支。这就是为什么你点击按钮时,未收藏的情况下永远不会执行添加逻辑——因为查询成功了(只是结果为空),根本走不到else里。

修复思路

我们需要调整逻辑:在task.isSuccessful()的分支里,先判断查询结果是否存在匹配的文档:

  • 如果有文档,说明用户已经收藏过,执行删除操作
  • 如果没有文档,说明用户未收藏,执行添加操作
  • 真正的查询失败场景(比如网络错误),再单独处理提示

修改后的代码

public void onClick(View view) { 
    fStore.collection("Favorites") 
        .whereEqualTo("shopID", SID)
        .whereEqualTo("usersID", UID) 
        .get() 
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { 
            @Override 
            public void onComplete(@NonNull Task<QuerySnapshot> task) { 
                if (task.isSuccessful()) { 
                    QuerySnapshot querySnapshot = task.getResult();
                    if (!querySnapshot.isEmpty()) {
                        // 存在收藏记录,执行删除
                        for (QueryDocumentSnapshot document : querySnapshot) { 
                            document.getReference().delete();
                        }
                        Toast.makeText(DetailsActivity.this, "Removed from favorites", Toast.LENGTH_SHORT).show();
                    } else {
                        // 无收藏记录,执行添加
                        Map<String, Object> fav = new HashMap<>(); 
                        fav.put("shopID", SID); 
                        fav.put("usersID", UID); 
                        fav.put("ShopHeaderImg", sHI); 
                        fav.put("ShopProfileImg", sPI); 
                        fav.put("address", sA); 
                        fav.put("costEst", sCost); 
                        fav.put("country", sC); 
                        fav.put("latitude", sLat); 
                        fav.put("location", sL); 
                        fav.put("name", sN); 
                        fav.put("numTables", sNumTable); 
                        fav.put("ratings", sR); 
                        fav.put("summary", sSummary); 
                        fav.put("timing", sT); 
                        
                        fStore.collection("Favorites").add(fav) 
                            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { 
                                @Override 
                                public void onSuccess(DocumentReference documentReference) { 
                                    Toast.makeText(DetailsActivity.this, "Saved", Toast.LENGTH_SHORT).show(); 
                                }
                            }).addOnFailureListener(new OnFailureListener() { 
                                @Override
                                public void onFailure(@NonNull Exception e) { 
                                    Toast.makeText(DetailsActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show(); 
                                } 
                            });
                    }
                } else {
                    // 查询本身失败的情况(比如网络、权限问题)
                    Toast.makeText(DetailsActivity.this, "Failed to check favorites", Toast.LENGTH_SHORT).show();
                } 
            } 
        });
}

关键修改点

  • 新增了querySnapshot.isEmpty()的判断,用来区分“已收藏”和“未收藏”的场景
  • 把添加逻辑从原来的else分支移到了“查询结果为空”的分支里
  • 给删除操作也加上了Toast提示,让用户有明确的反馈
  • 单独处理了查询失败的场景,提示更准确

这样调整后,点击按钮时就能正确触发“收藏/取消收藏”的切换逻辑啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:37:55