【问题标题】:How to undo a deletion made using Room persistent library?如何撤消使用 Room 持久库进行的删除?
【发布时间】:2020-01-25 01:33:38
【问题描述】:

我不确定这是否是一个合格的问题。

我正在使用快餐栏功能撤消删除,我真的很困惑如何去做。我正在使用房间库,删除后,与我的数据关联的 id 也被删除,因此我无法引用已删除的 id 以在该特定 id 处插入数据。当我单击撤消按钮时,我希望我的数据再次恢复到其旧位置,而不是作为新插入。

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

【问题讨论】:

标签: android android-room


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    添加一个新列并将其称为状态,例如默认值为 0 的标志

    如果它被删除,则将标志列设置为 1

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

    对于取消删除,您只需将标志设置回 1

    【讨论】:

    • 我用的是archived,通过这个字段过滤我从数据库中获取的对象,如果需要删除,我设置archived为true,否则archive为false,如果我“delete”则我所做的只是将 archived 设置为 true,这样您就可以保留数据并在必要时将其取回
    【解决方案3】:

    我建议您遵循酸奶的(评论)建议。因为如果你从数据库中删除它然后再次插入它,那么你必须获取整个列表并更新 recyclerView 两次。所以他建议的技术更适合性能。我会帮你实现它。首先,我建议您维护一个 abstract BaseAdapter 类,它是可选的,因为您可以直接在您的 RecyclerAdapter 中实现它。

    BaseAdapter

    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);
        }
    }
    

    现在您应该调用下面的deleteItem() 方法来临时从recyclerView 中删除,并在超时时完全删除。

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2015-09-17
      • 1970-01-01
      • 2011-08-07
      • 2016-12-04
      相关资源
      最近更新 更多