android - 使用警报对话框时在回收站视图中从 Firebase 中删除项目
问题描述
我使用 Firebase 数据库和存储将项目记录检索到回收站视图,并实施public void onDeleteClick(int position)
以删除所选项目。并添加了一个自定义警报框以确认删除。只需单击删除,它就可以在没有警报对话框的情况下很好地工作。但是当我从对话框中选择“否”时,它无法再次删除并显示以下错误。
你能帮我解决这个问题吗。
E/StorageException: StorageException has occurred.
Object does not exist at location.
Code: -13010 HttpResult: 404
E/StorageException: { "error": { "code": 404, "message": "Not Found. Could not delete object", "status": "DELETE_OBJECT" }}
java.io.IOException: { "error": { "code": 404, "message": "Not Found. Could not delete object", "status": "DELETE_OBJECT" }}
at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:445)
at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:462)
at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:453)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:272)
这是代码
@Override
public void onDeleteClick(int position) {
Upload selectedItem = mUploads.get(position);
StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getmImageUrl());
imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
View view = LayoutInflater.from(ShowPatientsRecords.this).inflate(R.layout.alertdelete, null);
Button no = view.findViewById(R.id.dltNo);
Button yes = view.findViewById(R.id.dltYes);
AlertDialog dialog = new AlertDialog.Builder(ShowPatientsRecords.this).setView(view).create();
dialog.setCancelable(false);
dialog.show();
yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Upload selectedItem = mUploads.get(position);
final String selectedKey = selectedItem.getmKey();
mDatabaseRef.child(selectedKey).removeValue(); **//This line is not working after No click in the Alert Dialog**
dialog.dismiss();
Toast.makeText(ShowPatientsRecords.this, "Record deleted", Toast.LENGTH_LONG).show();
}
});
no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
});
}
适配器类
@Override
public int getItemCount() {
return mUploads.size();
}
public class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
View.OnCreateContextMenuListener,
MenuItem.OnMenuItemClickListener{
public TextView recDate;
public TextView recDes;
public TextView recDoc;
public ImageView imageView;
public ImageViewHolder(@NonNull View itemView) {
super(itemView);
recDate = itemView.findViewById(R.id.showdate);
recDes = itemView.findViewById(R.id.showdescription);
recDoc = itemView.findViewById(R.id.showdoc);
imageView = itemView.findViewById(R.id.showImage);
itemView.setOnClickListener(this);
itemView.setOnCreateContextMenuListener(this);
}
@Override
public void onClick(View v) {
if (mListener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
mListener.onItemClick(position);
}
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Select Action");
MenuItem delete = menu.add(Menu.NONE, 1, 1, "Delete");
delete.setOnMenuItemClickListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (mListener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
switch (item.getItemId()) {
case 1:
mListener.onDeleteClick(position);
return true;
}
}
}
return false;
}
}
public interface OnItemClickListener {
void onItemClick(int position);
void onDeleteClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
}
解决方案
问题是您在显示要求用户确认的警报框之前从 Firebase 存储中删除了该文件。流程是:
- 用户单击Delete按钮。
- 您
onDeleteClick
会找到图像 URL 的文件。 - 您
onDeleteClick
删除该文件。 - 您
onDeleteClick
要求用户确认他们要删除该文件。 - 如果用户说“是”,
onDeleteClick
则从数据库中删除对该文件的引用。
从上面可以清楚地看出,您在代码中过早地删除了文件。如果用户在步骤 5 中单击“否”,然后Delete再次单击按钮,则错误来自步骤 2,因为文件已经消失。
解决方案是在删除文件之前要求确认:
@Override
public void onDeleteClick(int position) {
Upload selectedItem = mUploads.get(position);
StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getmImageUrl());
View view = LayoutInflater.from(ShowPatientsRecords.this).inflate(R.layout.alertdelete, null);
Button no = view.findViewById(R.id.dltNo);
Button yes = view.findViewById(R.id.dltYes);
AlertDialog dialog = new AlertDialog.Builder(ShowPatientsRecords.this).setView(view).create();
dialog.setCancelable(false);
dialog.show();
yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Upload selectedItem = mUploads.get(position);
final String selectedKey = selectedItem.getmKey();
imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mDatabaseRef.child(selectedKey).removeValue();
dialog.dismiss();
Toast.makeText(ShowPatientsRecords.this, "Record deleted", Toast.LENGTH_LONG).show();
}
});
}
});
no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
}
推荐阅读
- django - 在 Django 中处理重复的引导模式
- web-component - 我应该如何将 Web 组件添加到页面?
- php - PHP shell_exec:PHP 总是等待完成
- node.js - 如何从 s3 存储桶中的 tar.gz 读取文件
- javascript - d3 - 如何在月度图表上仅添加年份的 x 轴标签?
- php - PHP 正则表达式排除
- iphone - 创建 Siri 快捷方式以显示照片的经纬度
- docker - 有没有办法使用 github 操作插件 docker/build-push-action@v1 设置 docker build 的路径
- swift - PyTorch 到 CoreMl 的转换模型导致 RAM 使用量激增
- python-3.x - 由于内存不足,带有多线程的 Python 脚本被杀死