Android 如何撤消使用Room persistent library进行的删除?

Android 如何撤消使用Room persistent library进行的删除?,android,android-room,Android,Android Room,我不确定这是否是一个限定性问题 我正在使用snackbar功能来撤销删除操作,但我真的很困惑该怎么做。我正在使用文件室库,删除后,与我的数据关联的id也会被删除,因此我无法引用已删除的id在该特定id处插入数据。当我单击“撤消”按钮时,我希望我的数据再次恢复到其旧位置,而不是作为新的插入 如果根本不可能,请纠正我,或者提供任何替代方案。谢谢您可以在删除Id之前保存它,以便以后在代码中引用它。您可以在删除Id之前保存它,以便以后在代码中引用它。一种方法是使用软删除技术 添加一个新列,并使用默认值0

我不确定这是否是一个限定性问题

我正在使用snackbar功能来撤销删除操作,但我真的很困惑该怎么做。我正在使用文件室库,删除后,与我的数据关联的id也会被删除,因此我无法引用已删除的id在该特定id处插入数据。当我单击“撤消”按钮时,我希望我的数据再次恢复到其旧位置,而不是作为新的插入


如果根本不可能,请纠正我,或者提供任何替代方案。谢谢

您可以在删除Id之前保存它,以便以后在代码中引用它。

您可以在删除Id之前保存它,以便以后在代码中引用它。

一种方法是使用软删除技术

添加一个新列,并使用默认值0将其称为status,例如flag

然后,如果其已删除,则将标志列设置为1

并且查询只会在flag=0时得到结果


对于取消删除,您只需将标志设置回1即可。一种方法是使用软删除技术

添加一个新列,并使用默认值0将其称为status,例如flag

然后,如果其已删除,则将标志列设置为1

并且查询只会在flag=0时得到结果


对于取消删除,您只需将标志设置回1即可。我建议您遵循yogourt的建议。因为如果您从数据库中删除它,然后再次插入它,那么您必须获取整个列表并更新recyclerView两次。因此,他建议的技术对性能更有利。我将帮助你实施它。首先,我建议您维护一个抽象的BaseAdapter类,尽管它是可选的,因为您可以直接在RecyclerAdapter中实现它

基本适配器


我建议你遵循约古特的建议。因为如果您从数据库中删除它,然后再次插入它,那么您必须获取整个列表并更新recyclerView两次。因此,他建议的技术对性能更有利。我将帮助你实施它。首先,我建议您维护一个抽象的BaseAdapter类,尽管它是可选的,因为您可以直接在RecyclerAdapter中实现它

基本适配器


我想你应该在snackbar消失后执行删除操作,以防用户单击“撤消”,而你什么也不做。例如,Gmail就是这样做的。如果用户单击“撤消”,你应该在snackbar消失后执行删除操作,而不是什么都不做。例如,Gmail就是这样做的。我可能重复使用“存档”,并通过此字段过滤我从数据库中获取的对象,如果我需要删除,我将“存档”设置为true,否则“存档”为false,如果我“删除”,则我所做的一切都将“存档”设置为true,这样你就可以保留数据,并在必要时将其带回我使用的数据“已存档”,并通过此字段过滤我从数据库中获取的对象,如果我需要删除,我将“存档”设置为true,否则“存档”为false,如果我“删除”,则我所做的一切都将“存档”设置为true,这样您就可以保留数据,并在必要时将其带回
public abstract class BaseAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
   private List<T> mList = new ArrayList<>();

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public T remove(int position) {
        if (position < getItemCount() && position>= 0) {
            T item = mList.remove(position);
            notifyItemRemoved(position);
            return item;
        }
        return null;
    }

    public void add(T item, int position) {
        mList.add(position, item);
        notifyItemInserted(position);
    }

    public void addAll(List<T> items) {
        mList.addAll(items);
        notifyDataSetChanged();
    }

    public void reload(List<T> items) {
        mList.clear();
        addAll(items);
    }
}
private void deleteItem(View view, final int position) {
        final YourEntity item = adapter.remove(position);
        final Snackbar snackbar = Snackbar.make(view, item.getName() + " is Deleted", Snackbar.LENGTH_LONG);
        snackbar.setAction("Undo", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                adapter.add(item, position);
            }
        });
        snackbar.addCallback(new Snackbar.Callback() {
            @Override
            public void onDismissed(Snackbar transientBottomBar, int event) {
                if (event == DISMISS_EVENT_TIMEOUT) {
                    // TODO delete from the database
                }
            }
        });
        snackbar.show();
}