在小吃店操作中,如何确保从数据库中永久删除软删除的记录是安全的?

我在Android中使用Snackbar,并且我已经实现了一个操作,以便用户可以撤消该操作(该操作正在清除列表视图中的所有项目)。删除项目并将其添加回列表视图已经完成并且工作正常。

我的问题是,项目存储在sqlite数据库中,如何从表中删除这些项目?(我怎么知道用户没有点击撤消按钮,这样我就可以从数据库中完全删除数据)。

这是 OnOptionsItemSelcted() 中的代码

case R.id.action_clear:
        final List<Word> temp = new ArrayList<Word>(data);
        data.clear();
        adapter.notifyDataSetChanged();
        View view = findViewById(R.id.layoutFavWords);
        Snackbar.make(view,"Deleted Saved Selection.", Snackbar.LENGTH_LONG).
        setAction("Undo", new OnClickListener() {

            @Override
            public void onClick(View v) {
                for(Word word:temp)
                    data.add(word);
                adapter.notifyDataSetChanged(); 
            }

        }).show();
        break;

因此,如果用户在小吃店的可见期间没有单击撤消按钮,那么我需要从数据库中永久删除数据。

对此有什么解决方案吗?


答案 1

据我所知,这是设计使然。您应该:

  • 用户点击删除按钮后立即删除项目;
  • 将其临时存储在类变量中;
  • 如果用户点击“撤消”,请再次将该项目添加到数据库中。

这种方法更安全,更强大;你不应该等待小吃店被解雇,因为这种行为甚至不会发生。试想一下,当小吃店仍然打开时,用户强制退出应用程序:是否应该删除该项目?它应该。

一个更可靠的来源是Ian Lake的g +帖子(由于G +弃用而被删除)。在评论中,您可以阅读:

你希望你的UI立即做出反应(而不是等待小吃店消失) - 大多数系统(特别是那些同步到外部服务器的系统)都有“软删除”的概念,其中内容被标记为已删除。在这些情况下,撤消操作只是将记录取消标记为已删除。即使用户在小吃吧完成之前离开应用程序,此系统也可以工作(您不能假设小吃店将始终完成其动画!

最简单的方法是暂时将记录保存到其他地方(甚至是局部变量),然后在碰巧点击撤消按钮时重新插入它。


答案 2

Android 支持库 v23 添加了 Snackbar.Callback,您可以使用它来侦听零食栏是否被用户关闭或超时。

astinx的帖子中借用的示例:

Snackbar.make(getView(), "Hi there!", Snackbar.LENGTH_LONG).setCallback( new Snackbar.Callback() {
            @Override
            public void onDismissed(Snackbar snackbar, int event) {
                switch(event) {
                    case Snackbar.Callback.DISMISS_EVENT_ACTION:
                        Toast.makeText(getActivity(), "Clicked the action", Toast.LENGTH_LONG).show();
                        break;
                    case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
                        Toast.makeText(getActivity(), "Time out", Toast.LENGTH_LONG).show();
                        break;
                }
            }

            @Override
            public void onShown(Snackbar snackbar) {
                Toast.makeText(getActivity(), "This is my annoying step-brother", Toast.LENGTH_LONG).show();
            }
        }).setAction("Go away!", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        }).show();

推荐