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