簡體   English   中英

使用RxJava異步更新Android Realm

[英]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匹配的記錄的兩列。

但是,我在此方面面臨一些挑戰:

  1. 訂閱中的Action1返回RealmObject而不是PlayerObject
  2. 如何從這里繼續

任何對此的指導將不勝感激。

謝謝

更新資料

        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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM