创建父实体,然后使用父 ID 创建子实体

Create parent entity then create children entities with parent ID

在我的代码中,一个 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() 以记录错误:

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))
                    }))
}

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