如何知道firestore查询快照中是否存在数据?

时间:2018-05-31 06:44:16

标签: java android firebase google-cloud-firestore

这是我想要获取数据并知道数据是否存在的代码。 问题是,如果数据存在,它运行{ if(task.isSuccessful() },但如果数据不存在,它什么都不做!

我怎么知道数据不存在?我添加了其他{ 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()) {
                for (QueryDocumentSnapshot document : task.getResult()) {
                    if(document.exists()){
                        Toast.makeText(ListProducts.this, "Exists", Toast.LENGTH_SHORT).show();
                    }
                    else {
                        // This part is not running even if there is no data
                        Toast.makeText(ListProducts.this, "NOPE", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }
    });

4 个答案:

答案 0 :(得分:2)

您需要直接在exists()对象上使用QueryDocumentSnapshot方法,如下所示:

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()) {
                for (QueryDocumentSnapshot document : task.getResult()) {
                    if (document.exists()) {
                         Toast.makeText(ListProducts.this, document.toString(), Toast.LENGTH_SHORT).show();
                    }
                }
            } else{
                //This Toast will be displayed only when you'll have an error while getting documents.
                Toast.makeText(ListProducts.this, task.getException().toString(), Toast.LENGTH_SHORT).show();
            }
        }
    });

task.isSuccessful()用于处理侦听器成功或失败,exists()方法调用QueryDocumentSnapshot类的对象时扩展DocumentSnapshot类返回:

  

如果文档存在于此快照中,则为true。

答案 1 :(得分:0)

通过isEmpty()或size()方法成功完成任务后检查文档是否存在

if (task.isSuccessful()) {
    if(task.getResult().isEmpty()){
        //There is no such document do what ever you want!   
    }
    else {
        for (QueryDocumentSnapshot document : task.getResult()) {
            if (document.exists()) {
                Toast.makeText(ListProducts.this, document.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    }
}

if(task.getResult().size > 0){
    //Document exist
}

答案 2 :(得分:0)

我知道我来晚了一点,不知道您是否找到答案。但是我刚刚发现了如何做:

reference.whereEqualTo("ordered",false).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

    if (queryDocumentSnapshots.isEmpty()) {
        Snackbar.make(mainContactsLayout, "No matches found", Snackbar.LENGTH_SHORT).show();
    } else {

        for (DocumentSnapshot documentSnapshot : queryDocumentSnapshots.getDocuments()) {
            Snackbar.make(mainContactsLayout, documentSnapshot.getId(), Snackbar.LENGTH_SHORT).show();
        }
    }

}
});

答案 3 :(得分:0)

您需要验证文档列表是否为空

FirebaseFirestore.getInstance().collection(collectionName).whereEqualTo(cle
            , valeur)
            .get()
            .addOnCompleteListener(task -> {
                if (task.isSuccessful()) {
                    QuerySnapshot querySnapshot = task.getResult();
                        if (querySnapshot.isEmpty()) { // no documents found
                            // Type your code yere
                        } else {
                            for (QueryDocumentSnapshot document : querySnapshot){

                            }
                        }
                } else {
                    Log.d(TAG, methodName + task.getException());
                }
            });

如果我执行

for (int i = 2; i < 1; i ++) { }

没关系,但是我们永远也不会进入这个循环。上面的代码是一样的