Создайте родительский объект, затем создайте дочерние объекты с родительским идентификатором

#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 объектах отсутствовали некоторые обязательные поля перед вставкой в базу данных. Мой плохой!