我在我的应用程序中使用Room作为数据库层,并在网络调用中使用Retrofit - 无论是在房间还是改造中我都在使用RxJava2(这是我的第一个使用rxjava的项目,所以我在这方面仍然相当新手).要注入数据库,api等我正在使用Dagger 2.
我想进行网络呼叫并将响应从网络添加到数据库.当不需要再进行网络调用时 - 我想从数据库中获取数据.我在我的房间存储库中使用Maybe/Flowable时遇到问题.
这是道:
@Dao
public interface CoinDao {
@Query("SELECT * FROM coin")
Flowable<List<Coin>> getAllCoins();
@Insert
void insert(List<Coin> coins);
@Update
void update(Coin... coins);
@Delete
void delete(Coin... coins);
}
Run Code Online (Sandbox Code Playgroud)
这是我的存储库:
public class CoinRepository implements Repository {
private CoinMarketCapNetworkApi api;
private final CoinDao coinDao;
public CoinRepository(CoinMarketCapNetworkApi api, CoinDao coinDao) {
System.out.println("Creating CoinRepository");
this.api = api;
this.coinDao = coinDao;
}
@Override
public Flowable<List<Coin>> getCoinResults() {
System.out.println("getting coin results");
return getCoinResultsFromDatabase().switchIfEmpty(getCoinResultsFromNetwork())
}
@Override
public Flowable<List<Coin>> getCoinResultsFromNetwork() {
System.out.println("getting results from …Run Code Online (Sandbox Code Playgroud) 我正在使用Maybe访问数据库,我的目标是如果Maybe将完成指示数据库中没有数据(我正在使用会议室),则要致电网络。我有以下功能:
@Override
public Observable<List<Item>> getResults() {
return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
}
@Override
public Observable<List<Item>> getResultsFromNetwork() {
System.out.println("getting results from network");
return api.getData().doOnNext(new Consumer<List<Item>>() {
@Override
public void accept(List<Item> items) throws Exception {
itemDao.insert(items);
}
});
}
@Override
public Maybe<List<Item>> getResultsFromDatabase() {
System.out.println("getting coins from database");
return itemDao.getAllItems();
}
Run Code Online (Sandbox Code Playgroud)
但是,即使数据库中存在对象,switchIfEmpty也会总是被意外地工作,因为它总是被调用。
return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
Run Code Online (Sandbox Code Playgroud)