创建父实体,然后创建具有父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))
                    }))
}

现在您应该看到真正引发了什么错误。