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

Flo*_*her 3 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();
}
Run Code Online (Sandbox Code Playgroud)

或者我应该将数据库删除部分放入存储删除方法的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();
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 11

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

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

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

如果在数据库中使用悬空引用是最不危险的,请首先删除该文件,然后在Peter回答时更新数据库.

无论您选择哪种选项,通常都需要定期运行维护过程来清理数据库中的悬空引用和/或存储中的孤立文件.