从Firestore删除文档

时间:2020-05-15 08:21:24

标签: android google-cloud-firestore

我正在尝试从名为“照片”的集合中删除文档,但是它不起作用,没有OnFailureException消息,因为显示了OnSuccess Toast,但文档仍保留在Firestore中:(

消防站的结构: enter image description here

这是我用来删除文档的代码:

        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();
                        }
                    });

2 个答案:

答案 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(...

就目前而言,这个过程似乎还可以,尽管我不确定这是否是一个好习惯?如果没有,有人可以指出这种方法的缺点/缺点吗?

我注意到我必须使用意图来获取从上一个活动传递来的数据,以获取当前活动中的对象数据。