Search code examples
androidandroid-roomrx-java2reactivexflatmap

I want to "insert record to room database" -> "Api call " -> "Update local record"


I am new to rxjava android. I want to insert record in local room database. I set auto generate true so it will generate id for me. Then I want to make api call to send that record to server. After I get success in api call I want to update previously added record in my local database with serverId which I am getting from server. I know that I can achive this sequence using rxjava flatmap but I don't know how.

here is my insert method which returns id

@Insert
Single<Long> insertMessage(ChatMessage chatMessage);

here is my api call

@POST(ApiConstants.API_CHAT_SEND_MESSAGE)
Single<SendMessageResponse> sendChatMessage(@Body PostChatMessage postChatMessage);

and here is my update method

@Query("UPDATE message SET id = :id WHERE localId = :idToUpdate")
Single<Integer> updateMessage(String id, int idToUpdate);

any help would be appreciated


Solution

  • I tired this way for me its working fine and gave me expected result

     messageDao.insertMessage(chatMessage)
                    .subscribeOn(Schedulers.io())
                    .flatMap(id -> {
                        return ApiServiceClient.getApiServiceNew().sendChatMessage(postChatMessage).flatMap(sendMessageResponse -> {
                            messageDao.updateMessage(sendMessageResponse.getData().getId(), id);
                            return Single.just(id);
                        });
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeWith(new SingleObserver<Long>() {
                        @Override
                        public void onSubscribe(Disposable d) {
    
                        }
    
                        @Override
                        public void onSuccess(Long aLong) {
                            Log.d(TAG,"Record updated"+aLong);
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            Log.d(TAG,"Record Failed"+e.getMessage());
                        }
                    });