我有一个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?
我基本上想要两个信息:
- 如何在将文档Id添加到Firestore之前获取文档Id,以便将其附加到我的模型类中,然后根据该Id进行删除,有什么解决方案吗
- 或者,只需通过我在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)