我正在尝试从名为“照片”的集合中删除文档,但是它不起作用,没有OnFailureException消息,因为显示了OnSuccess Toast,但文档仍保留在Firestore中:(
这是我用来删除文档的代码:
Photo photo = (Photo) getIntent().getSerializableExtra("photo");
FirebaseFirestore db = FirebaseFirestore.getInstance();
String userId = mAuth.getCurrentUser().getUid();
CollectionReference photoRef = db.collection("main").document(userId).collection("photo");
DocumentReference document = photoRef.document(photo.getId());
String currentDocumentID = document.getId();
photoRef.document(currentDocumentID).delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(ViewPhotoActivity.this, "Entry Deleted", Toast.LENGTH_SHORT).show();
startActivity(new Intent(ViewPhotoActivity.this, PhotoActivity.class));
finish();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(ViewPhotoActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
});
答案 0 :(得分:2)
由于您没有足够的信息来创建文档,因此我在推测答案。
DocumentReference document = photoRef.document(photo.getId());
在上面的行中,您正在创建对带有照片ID的文档的引用。查看文档数据,似乎照片ID与文档ID 不相同。
因此,当您创建以上引用时,您不是在使用id="2BMG3..."
来引用现有文档,而是使用id="jYBPX..."
来引用新文档
String currentDocumentID = document.getId();
photoRef.document(currentDocumentID).delete()
如何修复它取决于您要保存/创建文档的方式。一种方法是首先在photo
中创建id= photo id
集合中的文档。
例如,在创建时,您可以按以下方式创建文档参考:
CollectionReference photoRef = db.collection("main")
.document(userId)
.collection("photo")
.document(photo.getId());
然后将数据设置为:
photoRef.set(photo);
这会将数据设置为您使用id=photo id
创建的文档。
如果您现在说明如何将文档添加到photo
集合中,则可以改进这些示例。如果您一直使用.colection('photo').add()
或.collection.document().set(photo)
,则创建的文档将具有与照片ID不同的自动生成的ID。
答案 1 :(得分:0)
我敢肯定有几种方法可以做到这一点,其中包括我在上面收到的答案,由于有时它不起作用或给我一个空异常,因此getID方法对我有些困惑,所以我更改了代码并使用一种更简单的方法,即在创建每个文档时为每个文档创建一个唯一的ID,然后使用该唯一的ID设置文档ID,以便我可以轻松地检索它们,在这种情况下,我通过组合标题和6个随机数字。
在创建文档时,我为每个文档添加了唯一的ID字段:
//set a unique ID for each photo
String randomSixNumbers = getRandomNumberString();
String photoId = (title.toLowerCase() + randomSixNumbers).replace(" ", "").trim();
//set ID to new object
Photo photo = new Photo(photoId, title, photoDescription, filePath, datePhoto);
//add object to firestore and set document ID as the uniqueID instead of the default auto-generated documentID
photoRef.document(photoId).set(photo).addOnSuccessListener(...
使用唯一ID删除文档:
photoRef.document(photo.getId()).delete().addOnSuccessListener(...
就目前而言,这个过程似乎还可以,尽管我不确定这是否是一个好习惯?如果没有,有人可以指出这种方法的缺点/缺点吗?
我注意到我必须使用意图来获取从上一个活动传递来的数据,以获取当前活动中的对象数据。