【问题标题】:How to restore an item deleted from Realm?如何恢复从 Realm 中删除的项目?
【发布时间】:2018-09-18 10:47:12
【问题描述】:

我正在创建一个带有滑动删除功能的 RecyclerView,但我不知道如何支持 undo 操作。

我的数据库是 Realm。当我需要删除一个项目时,我使用:

item.deleteFromRealm()

并将项目附加到 undoList 中,当我需要恢复它时,我使用:

realm.insert(undoList.last())

但我发现它是一个无效的对象。

我知道删除后保存的项目无效。

那么我怎样才能完成撤销功能呢?

【问题讨论】:

  • 你不能。唯一的方法是,不是实际删除该项目,而是将布尔标志设置为 true。或者有一个您重新插入以撤消的非托管副本。但是删除会使链接失效。

标签: android android-recyclerview realm


【解决方案1】:

您应该从 Realm 中删除该对象,或者至少现在不应该。

一个想法是向该对象添加一个自定义字段,类似于boolean askedForDeletion;(及其setter 和getter)。

然后,当你想删除它时,你只需将此字段设置为false,将其添加到撤消列表中,并要求RecyclerView重新加载:

item.setAskedForDeletion(false); 
undoList.add(item);
recyclerView.notifyDataSetChanged();

当然,RecyclerView 的数据集必须根据该变量过滤项目。在代码中的某处,您要求 Realm 为您提供项目。如果你有类似的东西:

realm.where([Item].class).findAll();

那么你应该更新它:

realm.where([Item].class).equalTo("askedForDeletion", false).findAll();

这样你只得到未删除的。

最后:决定应用删除“撤消列表”的时间。也许是“onDestroy”,或者您确信用户不会因为无法不再撤消而感到难过的地方。在那里,您应该删除所有要求删除的项目:

realm.where([Item].class).equalTo("askedForDeletion", true).findAll(); // And delete them as you prefer.

【讨论】:

  • 简单而有效的解决方案。我已经做到了。非常感谢。
  • P.S.我意识到可以通过这种方式创建一个垃圾桶,这意味着当用户清除垃圾桶时我们实际上可以删除项目
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2022-07-10
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
相关资源
最近更新 更多