#android #android-room #rx-java2
#Android #android-комната #rx-java2
Вопрос:
В моем коде у a 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.
Это исключение также предоставляет ссылку, которая подробнее объясняет эту конкретную ошибку, но подробности для меня не имеют смысла, поскольку я новичок с ограниченным опытом использования RxJava.
Что происходит?
ОБНОВЛЕНИЕ: В моей ViewModel подписка выглядит следующим образом:
createHero(powers)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::success, this::error);
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться той частью, где вы подписываетесь на свой
createHero()
вызов?2. Кроме того, почему бы просто не поместить список
Power
s в качестве свойства в свойHero
класс иHeroDao
будет иметьinsert
иupdate
в случае назначения новой мощности? Для меня это имело бы больше смысла.3. Мой плохой. Я обновил вопрос о том, как я подписываюсь в ViewModel. Пожалуйста, проверьте.
Ответ №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))
}))
}
Теперь вы должны увидеть, какая ошибка действительно выдается.
Комментарии:
1. В любом случае, весь мой код был в порядке, мне не хватало
.doOnError()
проверок, чтобы действительно добраться до корня проблемы. Оказалось, что в моихHero
объектах отсутствовали некоторые обязательные поля перед вставкой в базу данных. Мой плохой!