使用 Realm 和 RxJava
对于查询,Realm 提供了 realmResults.asObservable()
方法。只能在 looper 线程(通常是 UI 线程)上观察结果。
为此,你的配置必须包含以下内容
realmConfiguration = new RealmConfiguration.Builder(context) //
.rxFactory(new RealmObservableFactory()) //
//...
.build();
之后,你可以将结果用作可观察的结果。
Observable<RealmResults<SomeObject>> observable = results.asObservable();
对于异步查询,你应该通过 isLoaded()
过滤结果,以便仅在查询执行时才收到事件。同步查询不需要此 filter()
(isLoaded()
始终在同步查询时返回 true
)。
Subscription subscription = RxTextView.textChanges(editText).switchMap(charSequence ->
realm.where(SomeObject.class)
.contains("searchField", charSequence.toString(), Case.INSENSITIVE)
.findAllAsync()
.asObservable())
.filter(RealmResults::isLoaded) //
.subscribe(objects -> adapter.updateData(objects));
对于写入,你应该使用 executeTransactionAsync()
方法,或者在后台线程上打开 Realm 实例,同步执行事务,然后关闭 Realm 实例。
public Subscription loadObjectsFromNetwork() {
return objectApi.getObjects()
.subscribeOn(Schedulers.io())
.subscribe(response -> {
try(Realm realmInstance = Realm.getDefaultInstance()) {
realmInstance.executeTransaction(realm -> realm.insertOrUpdate(response.objects));
}
});
}