Room Flowable不会在插入时发出数据

问题描述 投票:1回答:1

我很难理解Flowable在Room中是如何工作的。我有像这样的Dao方法

@Insert(onConflict = OnConflictStrategy.REPLACE)
void upsert(List<Site> sites);

@Query("SELECT * FROM site ORDER BY distance ASC")
Flowable<List<Site>> getSites();

我希望每当我调用upsert订阅者Flowable返回的getSites()对象时,将始终被调用。我的假设是真的吗?

这就是我对这种流动性的描述

private final Flowable<List<Site>> siteFlowable;
ApiService apiService;
FuelDatabase database;

@Override
public void getSites(boolean showOnlyKeySites) {
    // add sites from cache first, then fetch network -> update cache -> update ui
    disposable = siteFlowable.flatMap(Flowable::fromIterable)
        .filter(site -> site.isValid())
        .buffer(100, TimeUnit.MILLISECONDS, 20)
        .takeUntil(sites -> sites.size() == 0)
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext(mapView::addPins)
        .subscribe(sites -> {
            Timber.d("Flowable emitted %d items", sites.size());
        }, Timber::e);

    apiService.getSites()
        .map(SiteListResponse::getData)
        .flatMap(Observable::fromIterable)
        .filter(Site::isValidSite)
        .toList().toObservable()
        .subscribe(sites -> {
            Timber.i("Success Fetching %d sites", sites.size());
            database.siteDao().clear();
            database.siteDao().upsert(sites);
        }, throwable -> Timber.e(throwable, "Error fetching sites"));
}

在调用upsert()之后,不会调用此可流动的。 API返回有效数据,数据将输入数据库。

android rx-java2 android-room android-database android-architecture-components
1个回答
-1
投票

试试这个:

apiService.getSites()
    .map(SiteListResponse::getData)
    .flatMap(result -> 
         Observable.fromIterable(result)
        .filter(Site::isValidSite)
        .toList()
        .toFlowable()
    )
    .subscribe(sites -> {
        Timber.i("Success Fetching %d sites", sites.size());
        database.siteDao().clear();
        database.siteDao().upsert(sites);
    }, throwable -> Timber.e(throwable, "Error fetching sites"));
© www.soinside.com 2019 - 2024. All rights reserved.