Мне нужно вставить данные в базу данных с помощью такого инструмента, как Room. Вот как я это делаю:
Это мой DAO
интерфейс
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import java.util.List;
import io.reactivex.Completable;
import io.reactivex.Observable;
@Dao
public interface MovieDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
Completable insertMovie(final MovieEntity movie);
}
Вот метод, который должен добавить данные в БД:
@Override
public void addMovieToFavorites(@Nonnull Bundle bundle) {
String url = bundle.getString(MovieListFragment.EXTRA_IMAGE);
int watchers = bundle.getInt(MovieDetailActivity.EXTRA_WATCHERS);
String name = bundle.getString(MovieDetailActivity.EXTRA_NAME);
MovieDatabase database = TraktTvApp.getInstance().getDatabase();
MovieDao movieDao = database.movieDao();
MovieEntity movieEntity = new MovieEntity(name, watchers, url);
mCompositeDisposable.add(Observable.fromCallable(() ->
movieDao.insertMovie(movieEntity))
.doOnSubscribe(disposable -> mView.showLoadingIndicator(true))
.doOnError(throwable -> mView.onMovieDetailsFailed())
.doOnComplete(() -> mView.onMoviesAdded())
.doOnTerminate(() -> mView.showLoadingIndicator(false))
.observeOn(Schedulers.io())
.subscribe()
);
}
Но, к сожалению, данные не добавляются в БД, как я вижу в Stetho. Так в чем же дело? Данные, которые я хочу добавить, не равны NULL, и при работе нет ошибок (так как вызывается метод onComplete). Поскольку я думаю, что есть проблема в логике rx, но я новичок в этом и не могу понять, почему моя проблема происходит
UPD
Я изменил логику rx следующим образом:
mCompositeDisposable.add(Observable.fromCallable(() -> movieDao.insertMovie(movieEntity))
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mView.showLoadingIndicator(true))
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> mView.onMovieDetailsFailed())
.doOnComplete(() -> mView.onMoviesAdded())
.doAfterTerminate(() -> mView.showLoadingIndicator(false))
.subscribe()
);
Но все равно не работает
UPD 2
mCompositeDisposable.add(movieDao.insertMovie(movieEntity)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> mView.showLoadingIndicator(true))
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> mView.onMovieDetailsFailed())
.doOnComplete(() -> mView.onMoviesAdded())
.doAfterTerminate(() -> mView.showLoadingIndicator(false))
.subscribe()
);