Realm + RxJava2 如何使用 equalTo 等

Realm + RxJava2 how to use equalTo and etc

现在,我正在尝试了解如何将 Realm 与 RxJava2 一起使用。没有太多信息。例如,我有一个简单的查询:

CommentObject firstComments =  realmForThisThread.where(CommentObject.class)
                .equalTo(CommentObject.COMMENT,comment).findFirst();

如何使用RxJava2获取firstComment?据我了解,asObservable 方法现在不起作用。

当我只想为一个模型而不是所有Realm数据库获取RealmResults或设置监听器时,出现了同样的问题。

有没有关于Realm + RxJava2的文档。我只找到了 RxJava,但不需要。在那之前我使用没有 Rx 的 Realm,但现在使用这个概念很重要

你可以在using Realm with RxJava2 in the Realm Academy上阅读我的文章。


同步单值查询公开为 Observable 毫无意义。

如果你想监听一个RealmObject是否存在01元素,那么你应该使用RealmResults<T>.asFlowable().

使用 RealmObject.asFlowable() 专为监听提供字段更改的单元素对象通知而设计。


反正用RxJava2就是让你把这个

public class MyActivity extends AppCompatActivity {
    Realm realm;
    RealmResults<Task> results; // kept as strong reference!
    RealmChangeListener<RealmResults<Task>> listener = new RealmChangeListener<RealmResults<Task>>() {        
        @Override
        public void onChange(RealmResults<Task> results) {
            if(results.isLoaded()) {
                // results is always up to date here
                // after a write to Realm from ANY thread!
                updateUi(results);
            }
        }
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
        ButterKnife.bind(this);

        realm = Realm.getDefaultInstance();
        results = realm.where(Task.class)
                                .findAllSortedAsync(TaskFields.ID); 
                                  // TaskFields is generated 
                                  // using https://github.com/cmelchior/realmfieldnameshelper
        results.addChangeListener(listener);
    }

    protected void onDestroy() {
        super.onDestroy();
        results.removeChangeListener(listener);
        results = null;
        realm.close();
    }

    private void updateUi(List<MyObject> objects) {
        // do something
    }
}

进入这个

@Singleton
public class TaskRepository  {
    @Inject
    public TaskRepository() {
    }

    // this implementation works on any thread.
    public Flowable<List<Task>> getTasks(Realm realm) {
        if(realm.isAutoRefresh()) { // for looper threads
            return realm.where(Task.class)
                    .findAllSortedAsync(TaskFields.ID)
                    .asFlowable()
                    .filter(RealmResults::isLoaded);
        } else { // for background threads
            return Flowable.just(realm.where(Task.class).findAllSorted(TaskFields.ID));
        }                    
    }
}

public class MyActivity extends AppCompatActivity {
    TaskRepository taskRepository;

    Realm realm;
    Disposable subscription;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
        ButterKnife.bind(this);

        realm = Realm.getDefaultInstance();
        taskRepository = Injector.get().taskRepository();
        subscription = taskRepository.getTasks(realm).subscribeWith(tasks -> {
            updateUi(tasks);
        });
    }

    protected void onDestroy() {
        super.onDestroy();
        subscription.dispose();
        subscription = null;
        realm.close();
    }

    private void updateUi(List<MyObject> objects) {
        // do something
    }
}