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(); }
每当您需要跨多个服务删除项目和引用时,您就有可能完成一个操作而另一个操作失败。 这会导致数据损坏,因此您需要找出对您的应用最不利的内容:
- 有一个孤立的图像,没有数据库节点引用它。
- 使数据库属性指向不再存在的图像。
如果孤立映像对应用程序的危害较小,请先删除数据库节点,然后在完成处理程序中删除该映像。 这是我的首选选项,因为我的客户端应用程序代码不需要对孤立映像进行任何特殊处理。
如果在数据库中使用悬空引用是最不危险的,请首先删除该文件,然后在Peter回答时更新数据库。
无论您选择哪种选项,您通常都希望定期运行维护过程,以清理数据库中的悬空引用和/或存储中的孤立文件。
StorageReference imageRef = FirebaseStorage.getInstance().getReferenceFromUrl(selectedItem.getImageUrl()); imageRef.delete().addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Void aVoid) { mDatabaseRef.child(selectedKey).removeValue(); } });
最好使用第二种方式,因为您知道删除将成功,然后还删除数据库中图像的链接。
比从数据库中删除更好,并且可能没有从存储中删除,例如,您将拥有一个没有图像的用户。
- 在发送数据时,从Android应用中的Firebase检索ServerValue.Timestamp
- Android – Firebase – 不同类型的用户登录
- DatabaseException:无法将java.lang.String类型的对象转换为type
- 无法加载“com.google.gson.JsonObject”类
- Firebase列表适配器构造函数错误
- Firebase RecylcerView适配器无法获得准确的视图位置
- 如何将Firebase RecyclerView放在另一个RecyclerView中
- 当子节点的父节点未知时从Firebase检索数据
- 有没有办法在我从Firebase对象转换的类中存储Key?