Android и RxJava: вставьте в базу данных Room ответ на модификацию

У меня есть два немного разных класса вопросов. Один из них представляет собой модифицированный объект результатов вызова, а другой — объект Room @Entity в моем приложении для Android.

И теперь я хочу, чтобы мой класс Interactor (использование) делал следующее:

  1. Сделайте вызов API и получите результат (укажите, где вопрос класс ответа «Дооснащение»)
  2. В случае успеха создайте новый игровой объект в моей базе данных Room. Эта операция имеет длинный (@Entity id, который генерируется автоматически) в качестве возврата тип.
  3. для каждого Вопроса из ответа на модернизацию (из (1)), вопрос -> Преобразователь, который преобразует из модернизированного. Вопрос в база данных.Вопрос. Метод конвертера принимает 2 параметра, объект retrofit.Question и идентификатор, возвращенный на шаге (2). После конвертации добавить в базу.
  4. Наблюдайте за AndroidSchedulers.mainthread. (subscribeOn вызывается из репозитория)

Теперь проблема, с которой я сталкиваюсь, заключается в создании этого потока с помощью RxJava из моего класса Interactor.

Вот все классы и звонки. Во-первых, это мой метод Interactor.class, который должен выполнять поток, описанный выше:

public Single<List<Question>> getQuestionByCategoryMultiple(String parameter);

ВЫЗОВ API из MyAPI.class:

//this Question is of database.Question.
Single<List<Question>> getQuestionByCategory(String parameter);

Репозиторий базы данных Room.class:

Single<Long> addGameReturnId(Game game);

Completable addQuestions(List<Question> questions);

Конвертер.класс:

public static List<database.Question> toDatabase(List<retrofit.Question> toConvert, int id);

У меня возникли проблемы с созданием потока, описанного выше, с помощью этих методов. Я пробовал сочетание .flatmap, .zip, .doOnSuccess и т. д. без успешного создания потока.

Если есть что-то еще, что вам нужно, чтобы я объяснил или объяснил проблему лучше, пожалуйста, прокомментируйте ниже.

public Single> getQuestionByCategoryMultiple (строковые параметры) {

    return openTDBType
            .getQuestionByCategory(paramters)    //step 1
            // step 2
            // step 3
            .observeOn(AndroidSchedulers.mainThread());   //step 4

}

Обновлено:

Я пробовал что-то вроде этого:

return openTDBType
                .getQuestionByCategory(parameters)
                .map(QuestionConverter::toDatabase)
                .flatMap(questions -> {
                    int id = gameRepositoryType.addGameReturnId(new Game(parameters).blockingGet().intValue();
                    questions.forEach(question -> question.setqId(id));
                    gameRepositoryType.addQuestions(questions);
                    return gameRepositoryType.getAllQuestions(); })
                .observeOn(AndroidSchedulers.mainThread());

^^ Я не знаю, лучший ли это способ сделать это? Может ли кто-нибудь подтвердить, является ли это хорошим способом разработки того, что я хочу здесь сделать, или есть ли лучшие способы или какие-либо предложения?

Меня смущает, почему Room DAO не отображает свои значения как Observable (или Flowable, в зависимости от того, что поддерживается).

EpicPandaForce 09.04.2019 02:41

@EpicPandaForce Не могли бы вы объяснить, что вы имеете в виду, я не совсем понимаю?

Carlton 09.04.2019 02:45
1
2
1 246
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Старайтесь не использовать blockingGet, особенно когда этого можно избежать. Кроме того, addQuestions вообще не будет выполняться, потому что на него нет подписки. Вы можете добавить как addGameReturnId, так и addQuestions в цепочку следующим образом:

return openTDBType
            .getQuestionByCategory(parameters)
            .map(QuestionConverter::toDatabase)
            .flatMap(questions -> {
                return gameRepositoryType.addGameReturnId(new Game(parameters)) // returns Single<Long>
                    .map(id -> {
                        questions.forEach(question -> question.setqId(id));
                        return questions;
                    })      
            }) // returns Single<List<Question>> with the GameId attached
            .flatMapCompletable(questions -> gameRepositoryType.addQuestions(questions)) // returns Completable
            .andThen(gameRepositoryType.getAllQuestions()) // returns Single<>
            .observeOn(AndroidSchedulers.mainThread());

Извините за позднее принятие. Это было почти то, что мне было нужно, так как flatMapCompletable() был ключом к созданию моего потока. Спасибо!

Carlton 27.04.2019 18:31

Другие вопросы по теме