[英]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.