Почему мой блок else не выполняется в моем OnClickListener в java android studio

#java #android #&oo&le-cloud-firestore

#java #Android #&oo&le-облако-firestore

Вопрос:

я создал функцию, которая позволяет пользователям моего приложения выбирать любимые магазины. теперь, если пользователь уже выбрал магазин и снова нажимает на кнопку, он должен удалить запись из базы данных firestore.

мой код работает, только если есть совпадение с запросом и задача выполнена успешно, но не выполняет мою else часть кода. почему это?

и вот приведенный ниже код отлично работает, когда есть совпадение для query и task is successful , но когда его нет, он не выполняет else часть. кто-нибудь знает почему?

 public void onClick(View view) {
        Task ref = fStore.collection("Favorites")
           .whereEqualTo("shopID", SID).whereEqualTo("usersID", UID)
                      .&et()
          .addOnCompleteListener(new OnCompleteListener<QuerySnapshot&&t;() {
                       @Override
     public void onComplete(@NonNull Task<QuerySnapshot&&t; task) {
                    if (task.isSuccessful()) {
             for (QueryDocumentSnapshot document : task.&etResult()) {
                              document.&etReference().delete();
                                        }
                   } else {
      Map<Strin&, Object&&t; fav = new HashMap<&&t;();
    
                         

         fav.put("shopID", SID);
         fav.put("usersID", UID);
         fav.put("ShopHeaderIm&", sHI);
         fav.put("ShopProfileIm&", 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("ratin&s", sR);
         fav.put("summary", sSummary);
         fav.put("timin&", sT);
    
    
                                      
      fStore.collection("Favorites").add(fav)
.addOnSuccessListener(new OnSuccessListener<DocumentReference&&t;() {
                       @Override
     public void onSuccess(DocumentReference documentReference) {
                                                Toast.makeText(DetailsActivity.this, "Saved", Toast.LENGTH_SHORT).show();
     }).addOnFailureListener(new OnFailureListener() {
    public void onFailure(@NonNull Exception e) {
   Toast.makeText(DetailsActivity.this, "Somethin& went wron&", Toast.LENGTH_SHORT).show();
                                            }
                                        });
                                    }
                                }
                          

  });
  

Ответ №1:

Я думаю, вы неправильно понимаете, что task.isSuccessful() означает. Этот метод вернет true, если во время выполнения запроса не было ошибок. Запрос, который не возвращает документов, не является ошибкой. Эта ситуация совершенно нормальная и считается успешной. Ошибка возникает только при попытке выполнить запрос, который Firestore фактически не может выполнить.

Если вы хотите проверить, не вернул ли запрос никаких документов, вам следует посмотреть на QuerySnapshot, содержащийся в результатах задачи. У него есть метод isEmpty(), который сообщит вам, есть ли документы.

 public void onComplete(@NonNull Task<QuerySnapshot&&t; task) {
    if (task.isSuccessful()) {
        QuerySnapshot querySnapshot = task.&etResult();
        if (querySnapshot.isEmpty()) {
            // put code here to deal with no documents in the result
        }
        else {
            // put code here to deal with documents present in the result
            for (QueryDocumentSnapshot document : querySnapshot) {
            }
        }
    }
}
  

Комментарии:

1. Вау, большое вам спасибо за разъяснение, я работал над этим уже два часа, я никак не мог этого понять. Спасибо!!! теперь он работает отлично.