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

时间:2018-01-30 17:23:52

标签: java android firebase firebase-realtime-database firebase-storage

假设我要删除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 个答案:

答案 0 :(得分:11)

每当您需要跨多个服务删除项目和引用时,您就有可能完成一个操作而另一个操作失败。此 会导致数据损坏,因此您需要找出对您的应用最不利的内容:

  1. 拥有孤立的图像,没有数据库节点引用它。
  2. 使数据库属性指向不再存在的图像。
  3. 如果孤立图像对应用程序的危害较小,请先删除数据库节点,然后在完成处理程序中删除该图像。这是我的首选选项,因为我的客户端应用程序代码不需要对孤立图像进行任何特殊处理。

    如果数据库中悬挂引用的危害最小,请先删除该文件,然后在Peter回答时更新数据库。

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

答案 1 :(得分:4)

  StorageReference imageRef = FirebaseStorage.getInstance().getReferenceFromUrl(selectedItem.getImageUrl());
imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
        mDatabaseRef.child(selectedKey).removeValue();
    }
});

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

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

相关问题