【问题标题】:How to delete Item from firestore in android with auto-generated document ID如何使用自动生成的文档 ID 从 android 的 firestore 中删除项目
【发布时间】:2021-07-22 02:48:11
【问题描述】:

我有一个 Firestore 数据库,它具有以下层次结构:

collection("notes") > document(currentUserId) > collection("mynotes") > document(auto-generated-key) > items...

我已将数据添加到 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。我知道有很多类似的问题,其中一些很好,但我无法解决它们。我查看了this link 解决方案,但我无法解决

在适配器中

 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?

我实际上做了很多研究,但无法弄清楚。任何快速帮助将不胜感激,谢谢。

【问题讨论】:

  • 调用document().getId() 只会生成一个新的唯一ID,因此该文档将不存在。与其关注您不知道的内容(ID),不如关注您对要删除的文档的了解做什么。假设集合中有 100 个文档,您如何决定要删除哪些文档?一旦知道这一点,您就可以编写一个查询来删除这些文档,如下所示:stackoverflow.com/a/47180442。另请参阅 Doug 的回答:stackoverflow.com/a/63972796
  • @FrankvanPuffelen 我只想得到那个 ID,这是我的主要观点。
  • 当您从 db 获取数据或添加新任务时,您可能希望将文档 ID 存储在 Notes 类中。
  • @Dharmaraj 是的,但在添加注释之前我无法找到文档 ID。那就是问题所在。如果您知道,任何帮助都会很棒。不太复杂,但我还没有找到解决方案。
  • 您实际上可以先在 firestore 中添加数据,然后在成功侦听器中包含包含文档键的响应。然后添加成功后,使用scheduledNote类构造对象。

标签: java android firebase google-cloud-firestore


【解决方案1】:

您似乎没有关注这个link solution。首先,正如@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();

【讨论】:

  • 感谢您的回答。它解决了,解释也很清楚。实际上,我对您在该解释中提到的 CollectionReference 感到困惑。另外,我写的这行代码 String id = database.collection("notes").document(mAuth.getUid()).collection("mynotes").document().getId();如果我将此 id 用作模型类中的 id 字段,并在添加我的注释时也制作文档 ID,这也可以。该解决方案与您编写的解决方案相同吗?我认为如果每次我向数据库添加注释时 id 都是唯一的,那很好。
  • 是的,完全相同的解决方案,但针对您的确切用例进行了重写。
【解决方案2】:

首先将没有任何数据的文档添加到您的集合中。

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

然后将文档 ID 添加到您的模型类以供以后使用。

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

addedDocRef.set(scheduleNoteModel)

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多