Я столкнулся с проблемой при вставке данных в локальную базу данных.у меня есть следующий scenerio.когда данные находятся в локальной базе данных, извлеките данные из локальной базы данных, если данных нет, сделайте вызов API и вставьте этот объект в локальное хранилище.
Примечание: я получаю данныеиз API в виде списка.Я пробовал вот так, но смог вставить только одну информацию в локальную базу данных
@Override
public void getEventDetail(JSONObject jsonObject) {
Single<List<EventDetailResponse>> getAllEventFromLocalDb = getDataManager().getAllEventDetail();
Single<List<EventDetailResponse>> getEventFromNetwork = getDataManager().doEventDetailCall(jsonObject);
Flowable<List<EventDetailResponse>> response = Single.concat(getAllEventFromLocalDb, getEventFromNetwork);
FlattenTransform<EventDetailResponse> flattenList = new FlattenTransform<EventDetailResponse>();
getCompositeDisposable().add(
(response)
.filter(list -> !list.isEmpty())
.first(new ArrayList<>())
.map(list->{
if(!list.isEmpty()){
for (int i=0;i<list.size();i++){
insertEventIntoLocalStorage(list.get(i));
}
}
return list;
})
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(s->{
}));
}
public void insertEventIntoLocalStorage(EventDetailResponse eventDetailResponse) {
getCompositeDisposable().add(getDataManager()
.insertEventDetail(eventDetailResponse)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(aLong -> {
Log.e("data","data inserted");
}, throwable -> {
handleError(throwable);
}));
}
У меня есть логика !!Надеюсь, это поможет кому-то: я редактирую приведенный выше код ниже.Любой хороший ответ больше, чем это ценится
Отправить запрос на сервер, чтобы найти данные:
@Override
public void getEventDetail(JSONObject jsonObject) {
getCompositeDisposable().add(
(getDataManager().doEventDetailCall(jsonObject))
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(list->{
if(!list.isEmpty()){
insertEventIntoLocalStorage(list);
}
}));
}
Вставить данные в базу данных, когда мы получим ответ от сети:
public void insertEventIntoLocalStorage(List<EventDetailResponse> eventDetailResponse) {
getCompositeDisposable().add(getDataManager()
.insertEventDetail(eventDetailResponse)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(aLong -> {
loadDataFromDb();
}, throwable -> {
handleError(throwable);
}));
}
Окончательно загрузить данные из базы данных
@Override
public void loadDataFromDb() {
getMvpView().showLoading();
getCompositeDisposable().add(getDataManager()
.getAllEventDetail()
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(result->{
getMvpView().showEventDetailFromDb(result);
getMvpView().hideLoading();
},throwable -> {
handleError(throwable);
getMvpView().hideLoading();
}));
}