[英]Android Realm Update Asynchronously Using RxJava
我有这个查询来更新我的领域表中已经存在的数据;
for (MyGameEntrySquad squad : response.body().getSquad()) {
subscription = realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId())
.findFirstAsync()
.asObservable()
.subscribe(new Action1<RealmObject>() {
@Override
public void call(RealmObject realmObject) {
}
});
}
我想异步执行此查询,然后在UI上显示结果。
基本上,任何由response.body()。getSquad()返回的内容都具有与数据库中已有记录匹配的ID; 这就是我的equalTo方法中使用的。
根据收到的数据,我想更新每个与ID匹配的记录的两列。
但是,我在此方面面临一些挑战:
任何对此的指导将不胜感激。
谢谢
更新资料
if (response.isSuccessful()) {
//asynchronously update the existing players records with my squad i.e is_selected
for (MyGameEntrySquad squad : response.body().getSquad()) {
realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId())
.findFirstAsync()
.<RealmPlayer>asObservable()
.filter(realmPlayer -> realmPlayer.isLoaded())
.subscribe(player -> {
realm.beginTransaction();
if (squad.getPlayer().getPosition().equals("GK")) {
player.setPlaygroundPosition("gk");
player.setIsSelected(true);
}
// pick the flex player
if (squad.isFlex()) {
player.setPlaygroundPosition("flex");
player.setIsSelected(true);
}
// pick the Goalie
if (squad.getPlayer().getPosition().equals("GK")) {
player.setPlaygroundPosition("gk");
player.setIsSelected(true);
}
// pick the DFs
if ((squad.getPlayer().getPosition().equals("DF")) && (!squad.isFlex())) {
int dfCounter = 1;
player.setPlaygroundPosition(String.format(Locale.ENGLISH, "df%d", dfCounter));
player.setIsSelected(true);
dfCounter++;
}
// pick the MFs
if ((squad.getPlayer().getPosition().equals("MF")) && (!squad.isFlex())) {
int mfCounter = 1;
player.setPlaygroundPosition(String.format(Locale.ENGLISH, "mf%d", mfCounter));
player.setIsSelected(true);
mfCounter++;
}
// pick the FWs
if ((squad.getPlayer().getPosition().equals("FW")) && (!squad.isFlex())) {
int fwCounter = 1;
player.setPlaygroundPosition(String.format(Locale.ENGLISH, "mf%d", fwCounter));
player.setIsSelected(true);
fwCounter++;
}
realm.copyToRealmOrUpdate(player);
realm.commitTransaction();
updateFieldPlayers();
});
}
hideProgressBar();
}
realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId())
.findFirstAsync()
.<RealmPlayer>asObservable()
.subscribe(new Action1<RealmPlayer>() {
@Override
public void call(RealmPlayer player) {
}
});
你应该那样做。
顺便说一句,循环执行是个坏主意-签入 RealmQuery的方法。
for (MyGameEntrySquad squad : response.body().getSquad()) { // btw why is this not `Observable.from()`?
subscription = realm.where(RealmPlayer.class).equalTo("id", squad.getPlayer().getId())
.findFirstAsync()
.asObservable()
这不应在UI线程上。 它应该在后台线程上。 在后台线程上,您需要使用同步查询而不是异步查询。
即使在UI线程上,您仍然需要filter(RealmObject::isLoaded)
因为它是一个异步查询,并且在findFirstAsync()
情况下,您还需要过滤RealmObject::isValid
。
对于这种情况,您不需要asObservable()
- 此方法用于观察特定项目并将RealmChangeListener
添加到该项目 。 考虑到这应该在具有同步查询的后台线程上,因此不需要(通过RealmChangeListener
不能观察到非RealmChangeListener
后台线程)。
您还应该在必要时取消订阅您创建的任何订阅。
是的,要以asObservable()
获得RealmPlayer
,请使用.<RealmPlayer>asObservable()
。
简而言之,您应该将该逻辑放在后台线程上,并监听UI线程上的更改。 后台线程逻辑必须使用同步API来完成。 为此,您不需要findFirstAsync
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.