繁体   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