如何在android中使用自动生成的文档ID从firestore中删除项目



我有一个Firestore数据库,该数据库具有以下分层形式的结构:

收藏("笔记"(>文档(currentUserId(>收藏("mynotes"(>文档(自动生成的密钥(>项目

我已将数据添加到Firestore,如下所示:

   mAuth = FirebaseAuth.getInstance();
   database = FirebaseFirestore.getInstance();
  
   //here scheduleModel is a model class with constructor(String, boolean, String) with getters and 
   //setters for three of them 
   scheduleNoteModel = new ScheduleNote(noteTitle, isImp, strDate);

我添加了这样的注释项目。

database.collection("notes").document(mAuth.getUid())
            .collection("mynotes")
            .document() //generated id automatically...
            .set(scheduleNoteModel)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Toast.makeText(getContext(), "data added ...", Toast.LENGTH_SHORT).show();
                    etNoteTitle.setText("");
                    //dismiss (hide) the bottom sheet after adding item
                    BottomSheetScheduleFragment.this.dismiss();
                    //refresh the fragment
                }
            });

问题是在删除项目时取回该id。我知道有很多类似的问题,其中一些很好,但我无法解决。我看过这个链接解决方案,但我没能解决

适配器内

 holder.deleteNoteIcon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            deleteNote(noteModel);
        }
    });

Method to delete
    private void deleteNote(ScheduleNote note, int itemPosition, View view) {
    mAuth = FirebaseAuth.getInstance();
    database = FirebaseFirestore.getInstance();
    //getting the doc id of auto-generated code in Firestore.
     String id = database.collection("notes").document(mAuth.getUid()).collection("mynotes").document().getId();
    Toast.makeText(context, "position " + itemPosition + "doc id " + id, Toast.LENGTH_SHORT).show();
    database.collection("notes").document(mAuth.getUid())
            .collection("mynotes")
            //.document("72NMkKY73CXHVN7DFE8W") get that id automatically
            .document(id)
            .delete()
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    //notifyDataSetChanged();
                    Snackbar snackbar = Snackbar.make(view, "Note Deleted successfully", Snackbar.LENGTH_SHORT);
                    snackbar.show();
                }
            });
}

上面变量中的id与实际id不匹配。如何获取该id?

我基本上想要两个信息:

  1. 如何在将文档Id添加到Firestore之前获取文档Id,以便将其附加到我的模型类中,然后根据该Id进行删除,有什么解决方案吗
  2. 或者,只需通过我在RecyclerView中单击项目时传递的模型类获取文档Id

我确实做了很多研究,但没能弄清楚。任何快速的帮助都将不胜感激,谢谢。

在我看来,你并没有遵循这个链接解决方案。首先,正如@Frank van Puffelen在评论中提到的那样;document((.getId(("每次调用时都会生成一个全新的ID。因此,您应该将该ID保存到一个变量中以供以后使用,这样您就可以直接从适配器中删除所需的文档。您的";ScheduleNote";阶级,除了";noteTitle"isImp";,以及";strDate"字段也应该包含一个称为"的字段;id";。所以你的声明类应该是这样的:

class ScheduleNote {
    public String noteTitle, strDate, id;
    public boolean isImp;
    public ScheduleNote() {}
    public ScheduleNote(String noteTitle, String strDate, String id, boolean isImp) {
        this.noteTitle = noteTitle;
        this.strDate = strDate;
        this.id = id;
        this.isImp = isImp;
    }
}

现在,在您的特定情况下,将对象添加到Firestore的以下代码行将起到作用:

CollectionRefference mynotes = database.collection("notes").document(mAuth.getUid())
        .collection("mynotes")
String docId = mynotes.document().getId();

为了创建一个对象";ScheduleNote";类型,请使用:

ScheduleNote scheduleNoteModel = new ScheduleNote(noteTitle, strDate, docId, isImp);
//                                                                     ^
//                                                                newly added

要实际将数据写入Firestore,请使用:

mynotes.document(docId).set(scheduleNoteModel).addOnSuccessListener(/* ... */);
//                 ^

为了能够删除该文档,您应该使用以下代码行:

database.collection("notes").document(mAuth.getUid())
        .collection("mynotes")
        .document(id)
        .delete(note.id)
        .addOnSuccessListener(/* ... */);

这是因为,下一行再次生成一个新的ID,这是不正确的,因为您需要使用之前生成的ID:

String id = database.collection("notes").document(mAuth.getUid()).collection("mynotes").document().getId();

首先,在没有任何数据的情况下将文档添加到集合中。

DocumentReference addedDocRef =database.collection("notes").document(mAuth.getUid())
            .collection("mynotes")
            .document();
log.i("Added document with ID: " + addedDocRef.getId());

然后将文档id添加到模型类中以供以后使用。

现在,使用模型类为文档设置数据。

addedDocRef.set(scheduleNoteModel)

最新更新