Realm实例关闭后无法读取数据、登出无法删除数据库问题咨询
问题1:关闭Realm实例后如何访问查询到的数据
你遇到的报错本质原因是:findAll()返回的是Realm托管对象集合,这类对象的生命周期和所属Realm实例完全绑定,一旦实例关闭,托管对象就无法再访问。
要在关闭Realm实例后依然能使用数据,只需要把查询结果转为非托管的独立副本即可,修改getAllMailList方法如下:
public static List<MailData> getAllMailList() { List<MailData> mails = new ArrayList<>(); try (Realm realm = Realm.getDefaultInstance()) { // 查询到托管集合后,转为非托管副本 RealmResults<MailData> managedMails = realm.where(MailData.class) .sort("receiveDate", Sort.DESCENDING) .findAll(); mails = realm.copyFromRealm(managedMails); } catch (Exception e){ e.printStackTrace(); } return mails; }
copyFromRealm会把托管对象的所有数据深拷贝到普通Java对象里,返回的集合和原Realm实例完全解绑,哪怕实例关闭也可以正常使用。
问题2:登出时如何正确删除Realm全部数据
你原有删除代码有两个错误:
- 把
Realm.deleteRealm放在了事务中执行,该方法要求执行时没有活跃事务 - 执行删除前没有确保所有线程、所有页面打开的Realm实例都已经关闭
正确的删除逻辑如下:
前置要求
如果你的App多页面都会用到Realm,建议做全局引用计数,每次获取实例计数+1,关闭实例计数-1,登出时等待计数归零再执行删除。如果是简单场景,只要确保所有页面在生命周期结束时(比如Activity.onDestroy、Fragment.onDestroyView)都关闭了自己打开的Realm实例即可。
正确删除代码
// 执行删除前要确保所有其他Realm实例都已关闭 try { // 先获取默认配置 RealmConfiguration config = Realm.getDefaultConfiguration(); // 直接删除Realm文件,不需要开启事务,也不需要额外调用deleteAll Realm.deleteRealm(config); } catch (Exception e){ e.printStackTrace(); }
注意:Realm.deleteRealm已经会删除整个数据库文件,不需要额外调用deleteAll,如果你只是想清空数据而不删库,才需要在事务中调用deleteAll。
内容的提问来源于stack exchange,提问作者Prantik Mondal
相关产品推荐
相关产品推荐

