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

假设我想删除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() { @Override public void onSuccess(Void aVoid) { mDatabaseRef.child(selectedKey).removeValue(); } }); mDatabaseRef.child(selectedKey).removeValue(); } 

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

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

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

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

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

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

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

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