Realm for Android:关于数据过期的问题

来源:转载

Realm for Android是个很好用的库,好处去看官网就可以了,这里就不多说了。在这里说一下这两天遇到的关于使用Realm的时候遇到一个奇怪的关于数据过期的问题。

Realm支持异步加载实现数据的自动更新通知,因此可以用来异步加载数据,比如可以向下面这样写:

Realm realm = Realm.getInstance(context);RealmResult<YouClass> result = realm.where(YourClass.class).findAllAsync();result.addChangeListener( new RealmChangeListener(){ @Override public void onChange(){ List<YourClass> container= new ArrayList<>(); container.addAll(result); //Use container to do something. } });

然后就可以使用container的数据去做其他的事情了,比如用于显示。

再次假设,发现某个实例你想从Realm数据存储空间删除,可能会向下面这样写:

YourClass instance = container.get(position);Realm realm = Realm.getInstance(context);RealmResult<YourClass> result = realm.where(YourClass.class).equals(instance.someField()).findAll();if(result.size()>0){ realm.beginTransaction(); result.remove(0); realm.commitTransaction();}

到这里没什么问题,但是如果再次假设(哪来这么多假设?)你因为某些原因想把这个数据再次插入到Realm中去,可能会这样写:

Realm realm = Realm.getInstance(context);realm.beginTransaction();realm.copyToRealm(instance);realm.commitTransaction();

可能在某些情况下插入一直不会成功,如果尝试打印出instance,会发现输出Invalid Object。当然这种情况出现是基于instance是来自最开始的RealmResult。

来自于RealmResult中的所有数据都会有Realm实例管理,由于你之前把对应instance从Realm存储空间中删除了,然后你用再出插入这个已经删除的实例引用,Realm不会执行,因为它会发现这个对象是不合法的对象也就是Invalid Object,不会执行插入(?)。

而解决这种方法就是复制一个不受Realm存储空间管理的实例就行了,然后使用这个实例删除和插入。

其实可以设想一个场景,在你的RecyclerView的Adapter中需要显示YourClass的数据,这些数据你之前存储在了Realm存储空间中,使用上面的方式获取数据传给RecyclerView的Adapter,然后你删除了某个数据,同时你提供了撤销的功能,然后用户选择了撤销,然后你又用最初由RealmResult获取的实例插入,那么数据就会无法插入到Realm存储空间中。


分享给朋友:
您可能感兴趣的文章:
随机阅读: