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
相关产品推荐
相关产品推荐

