使用RxJava异步更新Android Realm



我有这个查询来更新我的领域表中已经存在的数据;

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((返回的任何内容都有一个与DB中已有记录相匹配的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 s无法观察到非活套后台线程(。

必要时,您还应该取消订阅您创建的任何订阅。

是的,要在asObservable()中获得RealmPlayer,请使用.<RealmPlayer>asObservable()

简而言之,您应该将该逻辑放在后台线程上,并侦听UI线程上的更改。后台线程逻辑必须使用同步API完成。您不需要findFirstAsync

相关内容

  • 没有找到相关文章

最新更新