【问题标题】:How to delete documents from firebase firestore using where clause inside OnClickListener如何使用 OnClickListener 中的 where 子句从 firebase firestore 中删除文档
【发布时间】:2020-11-28 23:19:38
【问题描述】:

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

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

我阅读了 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 firestore 做到这一点?

【问题讨论】:

  • 我想知道你为什么将听众声明为另一个听众。我的意思是从更高层次的角度来看。我想说在点击监听器中你应该通过“触发”一个事件来“触发”你的监听器。

标签: java android firebase android-studio google-cloud-firestore


【解决方案1】:

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

尝试为此使用 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

【讨论】:

    猜你喜欢
    • 2018-04-21
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2021-02-20
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多