现在,我试图了解如何将Realm与RxJava2一起使用。没有太多的信息。例如,我有一个简单的查询:
CommentObject firstComments = realmForThisThread.where(CommentObject.class)
.equalTo(CommentObject.COMMENT,comment).findFirst();
如何使用RxJava2获取firstComment?据我所知,可观察方法现在不起作用。
当我想获取RealmResults或仅为一个模型而不是所有Realm数据库设置监听器时,会出现相同的问题。
是否有关于Realm + RxJava2的任何文档。我发现只有RxJava,但它不需要。在此之前,我在没有Rx的情况下使用Realm,但现在使用这个概念非常重要
答案 0 :(得分:3)
您可以在using Realm with RxJava2 in the Realm Academy上阅读我的文章。
将同步单值查询作为Observable公开是没有意义的。
如果您想听取RealmObject中是否存在0
或1
元素,那么您应该使用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
}
}