使用 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));
}
});
}