繁体   English   中英

如何使用 OnClickListener 中的 where 子句从 firebase firestore 中删除文档

[英]How to delete documents from firebase firestore using where clause inside OnClickListener

我想在点击监听器上检查文档是否已经存在。

如果此文档已经存在,则应将其删除且不再添加。

我阅读了 firebase firestore 文档,但他们没有提供有关这些问题的太多细节。

所以这是我尝试过的:

这是我的 onclick 监听器,如果不存在,它将向数据库添加一个文档:

details_fave.setOnClickListener(new View.OnClickListener() {
  @Override
            public void onClick(View view) {
                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();
                    }
                });
            }
        });

         

我首先要做的是检查文档是否存在,如果存在则删除它,如果不存在则插入。

如果在 where 子句中找到记录,这就是我要删除的记录:

 Task<QuerySnapshot> ref = fStore.collection("Favorites")
                .whereEqualTo("usersID", UID).whereEqualTo("shopID",SID)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                document.getReference().delete();
                            }
                        } else {
                            Log.d("whatever", "Error getting documents: ", task.getException());
                        }
                    }
                });

但我仍然如何在 onclick 监听器中实现它?

我怎么能用 firebase 火库做到这一点?

首先,您应该将您的应用程序与访问数据的所有逻辑分开。

尝试为此使用 ViewModel。

无论如何,我会做这样的事情:

 public void onClick(View view) {
    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);

    Task<QuerySnapshot> ref = fStore.collection("Favorites")
            .whereEqualTo("usersID", UID).whereEqualTo("shopID",SID)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        //if there is no document to delete the loop will exit without iterating even once
                        for (QueryDocumentSnapshot document : task.getResult()) 
                            document.getReference().delete();
                        //here we stand when we cleared the history of the user favorite list in the specific store, we can enter the new list
                        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 {
                        Log.d("whatever", "Error getting documents: ", task.getException());
                    }
                }
            });

    
}

这有点乱,但它会完成工作。

如果您对预制件有类似的操作,但不包括查询文档,请使用TRANSACTIONS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM