【问题标题】:I want to delete the array stored in Firestore我想删除存储在 Firestore 中的数组
【发布时间】:2020-10-08 19:31:29
【问题描述】:

我收到了用户的邮件并将其指定为文档的名称, 并将文档中的用户信息存储在一个数组中。我尝试运行我的代码,但只执行 Toast 消息,而不是删除。

我已使用RecyclerView 将数组列为列表。删除将通过showPop()方法实现。

这是我的 Firestore 数据库enter image description here 我想删除 index-0

  private void showPopup(View v,final int position) {  

  PopupMenu popup = new PopupMenu(activity, v);
  popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    .....
                    case R.id.delete: //delete
                        final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                        final FirebaseFirestore db = FirebaseFirestore.getInstance();
                        final Map<String, Object> updates = new HashMap<>();
                        updates.put(user.getEmail(),FieldValue.delete());

                        //db.collection("medicinday").document(mDataset.get(position).getId())
                          //      .delete()
                        db.collection("medicinday").document(user.getEmail()).update("add_day", FieldValue.arrayRemove(user.getEmail()))
                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        Toast.makeText(....
                                    }
                                })
                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                 ....

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    您无法删除/更新 Firestore 数组中特定索引处的元素。欲了解更多信息,请查看我在以下帖子中的回答:

    Is there any way to update a specific index from the array in Firestore

    在您的特定情况下,add_day 属性是一个包含对象的数组。如果要从该数组中删除一个项目,则需要传递该项目的整个对象值。如果您只传递索引或该项目中的嵌套值之一,它将不起作用

    对于您的数据类型,您需要使用第一个项目的确切内容构建一个Map,并将该对象传递给update() 方法,如以下代码行所示:

    String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    CollectionReference medicinDayRef = rootRef.collection("medicinday");
    DocumentReference emailRef = medicinDayRef.document(email);
    HashMap<String, Object> doc = new HashMap<>();
    doc.put("day", "monday");
    doc.put("king" , "A");
    doc.put("nam" , "ren");
    doc.put("time1" , "AM 7:30");
    doc.put("time2" , "PM 2:30");
    doc.put("time3" , "PM 8:30");
    emailRef.update("add_day", FieldValue.arrayRemove(doc));
    

    请注意,如果您不知道整个项目的内容,它将不起作用

    另一种选择可能是读取文档,通过删除位置一的项目来修改客户端上的列表,将修改后的列表写回文档,最后简单地将其写回 Firestore。

    可以在此处找到有关此主题的更多信息:

    Android Firestore querying particular value in Array of Objects

    在下面的文章中:

    How to map an array of objects from Cloud Firestore to a List of objects?

    【讨论】:

    • 谢谢!我已经在我的代码中反映了您的 cmets,但它与您想要的方式不同,而且我遇到了另一个在 Firestore 中难以实现的答案。我想再问一次。我正在通过 showpopup 从回收商制作的列表中删除所需索引值的数据。这可能吗?
    • 不,这是不可能的。您不能通过索引从数组中删除项目。
    【解决方案2】:

    您要从 Firestore 中删除的行似乎已被注释掉,除非现在是故意的。

    从您发送的图片中,我了解到add_day 是您的数组,0 是您要删除的元素。为此,您可以访问文档的字段 add_day,然后使用 arrayRemove() 专门删除您选择的元素。

    大致参考链接的文档,我相信您可以通过运行以下来实现。

    DocumentReference doc = db.collection("medicinday").document("222@naver.com");
    
    ApiFuture<WriteResult> remove = doc.update("add_day", FieldValue.arrayRemove("0"));
    
    System.out.println("Update time : " + arrayRm.get());
    

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2021-08-12
      • 2021-02-04
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      相关资源
      最近更新 更多