Realm + RxJava2如何使用equalTo等

时间:2017-09-16 10:30:56

标签: android realm rx-java2

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

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

如何使用RxJava2获取firstComment?据我所知,可观察方法现在不起作用。

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

是否有关于Realm + RxJava2的任何文档。我发现只有RxJava,但它不需要。在此之前,我在没有Rx的情况下使用Realm,但现在使用这个概念非常重要

1 个答案:

答案 0 :(得分:3)

您可以在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
    }
}