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

标签 java android android-support-library android-design-library snackbar

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

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

这是OnOptionsItemSelected()

里面的代码
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;

所以如果用户在snackbar的可见期间没有点击撤消按钮,那么我需要从数据库中永久删除数据。

有什么解决办法吗?

最佳答案

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

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

这种方法更安全、更健壮;你不应该等待 snackbar 被解雇,因为那个 Action 甚至不可能发生。试想一下用户在snackbar 仍然打开时强制退出应用程序:该项目是否应该被删除?应该的。

更值得信赖的来源是 Ian Lake 的 g+ 帖子(由于 G+ 弃用而被删除)。在评论中你可以阅读:

you want your UI to react immediately (not wait for the snackbar to disappear) - most systems (particularly those that sync to an external server) have the concept of a 'soft delete' where things are marked as deleted. In those cases, an undo action would just be unmarking the record as deleted. This system works even if the user were to leave the app before the snackbar finishes (you can't assume the snackbar will always complete its animation!).

The easiest way to do that is to temporarily save the record elsewhere (even a local variable), then re-insert it if they happen to hit the undo button.

关于java - 在 snackbar 操作中,如何确保从数据库中永久删除软删除记录是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056939/

相关文章:

android - 从 Android App 传递参数到 Facebook App Link

android - Appcompat V7 - v21 抽屉导航不显示汉堡包图标

android - float 操作按钮在 Lollipop 之前的设备上位置错误

java - 整理/管理数据以在 Web 应用程序中填充 "live activity feeds"

java - 使用 Java 图形 API 时遇到的问题

java - 我的事件监听器有什么java

java - 如何使用 Hibernate 根据产品名称和价格搜索类别?

android - Xamarin.UI 测试异常

android - 如何列出从 android 市场购买的元素

android 支持库 v 23.3.0 snackbar 问题