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