代码之家  ›  专栏  ›  技术社区  ›  Florian Walther

Firebase:从存储和数据库中删除时,存储删除是否应该在存储删除的onSuccessListener中?

  •  3
  • Florian Walther  · 技术社区  · 7 年前

    假设我想从Firebase存储中删除一个条目,也要从Firebase数据库中删除元数据。然后我是否应该像这样独立地删除它们:

    @Override
    public void onDeleteClick(int position) {
        Upload selectedItem = mUploads.get(position);
        String selectedKey = selectedItem.getKey();
    
        StorageReference imageRef = FirebaseStorage.getInstance().getReferenceFromUrl(selectedItem.getImageUrl());
        imageRef.delete();
    
        mDatabaseRef.child(selectedKey).removeValue();
    }
    

    或者我应该将数据库删除部分放入存储删除方法的onSuccessListener中吗?

    @Override
    public void onDeleteClick(int position) {
        Upload selectedItem = mUploads.get(position);
        final String selectedKey = selectedItem.getKey();
    
        StorageReference imageRef = FirebaseStorage.getInstance().getReferenceFromUrl(selectedItem.getImageUrl());
        imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                mDatabaseRef.child(selectedKey).removeValue();
            }
        });
    
        mDatabaseRef.child(selectedKey).removeValue();
    }
    
    2 回复  |  直到 7 年前
        1
  •  11
  •   Dominic Cronin    7 年前

    每当您需要跨多个服务删除一个项目和引用时,您都有可能一个操作完成,另一个操作失败。这 导致数据损坏,因此您需要找出对您的应用危害最小的是什么:

    1. 具有孤立图像,没有数据库节点引用它。
    2. 具有指向不再存在的图像的数据库属性。

    如果孤立图像对应用程序危害较小,请先删除数据库节点,然后在完成处理程序中删除图像。这是我的首选选项,因为我的客户端应用程序代码不需要对孤立图像进行任何特殊处理。

    如果数据库中有一个悬空引用的危害最小,请先删除该文件,然后按照Peter的回答更新数据库。

    无论选择哪个选项,您通常都希望定期运行维护过程,以清理数据库中的悬空引用和/或存储中的孤立文件。

        2
  •  4
  •   Peter Haddad    7 年前
      StorageReference imageRef = FirebaseStorage.getInstance().getReferenceFromUrl(selectedItem.getImageUrl());
    imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            mDatabaseRef.child(selectedKey).removeValue();
        }
    });
    

    最好使用第二种方法,因为您知道删除会成功,然后还可以删除数据库中图像的链接。

    比从数据库中删除(可能它没有从存储中删除)更好,例如,您将有一个没有图像的用户。