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是否存在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
}
}
现在,我正在尝试了解如何将 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是否存在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
}
}