Android--›Realm数据库使用注意事项

不知不觉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个对象:

  1. Realm托管对象
  2. Java对象

当你使用realm对象查询数据库时, 默认查询到的数据都是Realm托管对象.

那么什么是Realm托管对象呢?

简单来说就是, 对象本身是个空壳, 对象所有的字段值, 在内存中都是null, 要想正真获取字段值, 必须调用get方法, 因为Realm接管了对象所有字段的get方法. 这样可以达到对象极少的内存占用, 并且为对象数值改变监听方法提供了可能性.
当你调用Realm.close()方法后, 所有的托管对象get方法统统失效.所以空指针异常也就来了.

如何解决?
1. 在相同线程的情况下, 可以不关闭Realm
2. 使用RealmcopyFromRealm方法, 将托管对象转换成Java对象


….
后续添加.


也许你还想学习更多, 来我的群吧, 我写代码的能力, 远大于写文章的能力:

联系作者

点此快速加群

请使用QQ扫码加群, 小伙伴们都在等着你哦!

关注我的公众号, 每天都能一起玩耍哦!

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页