【问题标题】:Create parent entity then create children entities with parent ID创建父实体,然后创建具有父 ID 的子实体
【发布时间】:2020-08-19 10:30:50
【问题描述】:

在我的代码中,Hero 有许多 Power。要创建一个Power 对象,我需要一个heroId。在这种情况下,我正在尝试创建一个英雄,然后赋予该英雄多种权力。

因此,HeroDao:

@Dao
public interface HeroDao {
    @Insert
    Single<Long> create(Hero hero);
}

还有PowerDao

@Dao
public interface PowerDao {
    @Insert
    Completable create(Power power);
}

所以,

Completable createHero(List<Power> powers) {
    return heroDao.create(new Hero())
            .flatMapCompletable(heroId -> Observable.fromIterable(powers)
                    .flatMapCompletable(power -> {
                        power.heroId = heroId;
                        return powerDao.create(power);
                    }))
            .subscribeOn(Schedulers.io());
}

但这反而会引发异常:

io.reactivex.exceptions.UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with.

该异常还提供了一个link,它解释了有关该特定错误的更多信息,但细节对我来说没有意义,因为我是一个初学者,使用 RxJava 的经验有限。

发生了什么事?

更新: 在我的 ViewModel 中,订阅如下所示:

createHero(powers)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(this::success, this::error);

【问题讨论】:

  • 能否分享您订阅createHero() 电话的部分?
  • 另外,为什么不把Powers 列表作为属性放在Hero 类中,而HeroDao 将拥有insertupdate,以防分配新的权力?对我来说更有意义。
  • 我的错。我已经用我在 ViewModel 中的订阅方式更新了这个问题。请检查。

标签: android android-room rx-java2


【解决方案1】:

更新您的 createHero() 以记录错误:

Completable createHero(List<Power> powers) {
    return heroDao.create(new Hero())
            // add explicit error log
            .doOnError(e -> Log.e("ERROR", "insert hero error", e))
            .flatMapCompletable(heroId -> Observable.fromIterable(powers)
                    .flatMapCompletable(power -> {
                        power.setHeroId(heroId);
                        return create(power)
                                .doOnError(e -> Log.e("ERROR", "insert power error", e))
                    }))
}

您现在应该看到真正抛出了什么错误。

【讨论】:

  • 在任何情况下,我的所有代码都很好,只是我缺少.doOnError() 检查才能真正找到问题的根源。原来我的Hero 对象在插入数据库之前缺少一些必填字段。我的坏蛋!
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 2019-07-27
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多