不知不觉Realm已经更新到5.4.0了.
Realm Java 5.4.0
但是,还有多少坑等着你呢?
以下写一些我遇到的坑:
1:Realm需不需要close呢? 2017-01-10
当你每次调用 Realm.getDefaultInstance();
的时候, Realm
的引用计数就会+1.
也就是说, close()
方法调用次数也要+1, 才能释放Realm资源.
Realm
再调用close
之后, 对应线程上where查询出来的结果数据, 会被清空.
比如, realm.where(User.class).findAll().
得到了一个集合, 当你close
之后,
集合中的user对象的所有字段数据都会失效.
原因就是, Realm使用的是代理的方法得到字段的值, 也就是你必须要通过get方法返回字段的值
才有效. 如果你直接通过成员是访问不到数据的.
这样做了,也就很容易实现realm的数据变换监听事件通知了.
所以: 如果你需要一直保持对查询出来的数据引用的话, 请不要close
. 否则数据全部会失效.
如果你既想close
, 又想数据有效. 那么请new一个对象, 并且调用get方法set方法, 读取和设置数据
切记不可 直接访问成员变量读取数据字段值….这样是会返回null的.
总结一下:
从Realm
数据库中通过where查询出来的对象user.
1:在调用close()
方法之后, user对象会处于无效状态, 此时调用get方法会报异常.
2:直接通过user.成员变量的方式, 读取到的数据是null. 必须通过get方法才能拿到数据.
2: Realm托管对象, 是啥? 2018-7-23
用Realm
你必须了解托管对象, 否则你就是一个不会使用Realm
的开发者.
使用Realm
一定要知道的2个对象:
- Realm托管对象
- Java对象
当你使用realm
对象查询数据库时, 默认查询到的数据都是Realm托管对象
.
那么什么是Realm托管对象
呢?
简单来说就是, 对象本身是个空壳, 对象所有的字段值, 在内存中都是
null
, 要想正真获取字段值, 必须调用get
方法, 因为Realm
接管了对象所有字段的get
方法. 这样可以达到对象极少的内存占用, 并且为对象数值改变监听方法提供了可能性.
当你调用Realm.close()
方法后, 所有的托管对象
的get
方法统统失效.所以空指针异常
也就来了.
如何解决?
1. 在相同线程的情况下, 可以不关闭Realm
2. 使用Realm
的copyFromRealm
方法, 将托管对象
转换成Java对象
….
后续添加.
也许你还想学习更多, 来我的群吧, 我写代码的能力, 远大于写文章的能力:
联系作者
请使用QQ扫码加群, 小伙伴们都在等着你哦!
关注我的公众号, 每天都能一起玩耍哦!