带 RxJava2 的房间 -(可流动、可能、存储库模式)
Room with RxJava2 - (Flowable, Maybe, Repository Pattern)
我在我的应用程序中将 Room 用于数据库层,并将 Retrofit 用于网络调用 - 在 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);
}
这是我的存储库:
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 network");
return api.getCoins().doOnNext(new Consumer<List<Coin>>() {
@Override
public void accept(List<Coin> coins) throws Exception {
System.out.println("inserting to db");
coinDao.insert(coins);
}
});
}
@Override
public Flowable<List<Coin>> getCoinResultsFromDatabase() {
System.out.println("getting coins from database");
return coinDao.getAllCoins();
}
}
我首先运行应用只用网络调用填充数据库
@Override
public Flowable<List<Coin>> getCoinResults() {
return getCoinResultsFromNetwork();
}
并且当执行网络调用时,数据已成功添加到数据库中 - 我 运行 应用程序再次仅从数据库中获取数据并且它也成功 - 数据是从数据库中获取的。
@Override
public Flowable<List<Coin>> getCoinResults() {
return getCoinResultsFromDatabase();
}
但是当我现在尝试做这样的事情时
return getCoinResultsFromDatabase.switchIfEmpty(getCoinResultsFromMemory));
问题是每次执行switchIfEmpty和每次执行"getCoinResultsFromMemory()"(即使数据库中的数据可用)。
根据https://medium.com/google-developers/room-rxjava-acb0cd4f3757
我读过当数据库中没有数据时 Flowable 不会发出任何东西,我应该使用 Maybe。但是为什么即使数据库中有数据,getResultsFromMemory() return 还是空的?在这种情况下我应该如何使用 Maybe?
我尝试将 Flowable 更改为 Maybe
Maybe<List<Coin>> getCoinResultsFromDatabase()
并做这样的事情 - 从 maybe 访问结果并检查列表是否为空,但我不知道如何 return 在这种情况下可流动:
public Flowable<List<Coin>> getCoinResults() {
getCoinResultsFromDatabase().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<Coin>>() {
@Override
public void accept(List<Coin> coins) throws Exception {
System.out.println("returning coins from maybe" + coins.get(0).getId());
if (coins.isEmpty()) {
System.out.println("coin list is empty");
Flowable<List<Coin>> flowable = getCoinResultsFromNetwork();
} else {
Flowable<List<Coin>> flowable = getCoinResultsFromDatabase();
}
}
});
return flowable //how to access this flowable??
}
也许我遗漏了一些东西并且有更好更干净的解决方案。
您的代码有几个问题:
1.Looks 就像在房间 Flowable<List<Coin>> getAllCoins()
中总是 return 一些值:项目列表或空列表所以 Maybe
在这里没有帮助
2.In这段代码
@Override
public Flowable<List<Coin>> getCoinResults() {
System.out.println("getting coin results");
return getCoinResultsFromDatabase().switchIfEmpty(getCoinResultsFromNetwork())
}
当你调用 getCoinResults
方法时,getCoinResultsFromNetwork
被调用,而不是当 flowable 为空时(这是普通的 java 方法调用)
您需要执行延迟调用。最终的解决方案可能是这样的
@Override
public Flowable<List<Coin>> getCoinResults() {
System.out.println("getting coin results");
return getCoinResultsFromDatabase()
.filter(list -> !list.isEmpty())
.switchIfEmpty(
Flowable.defer(() -> getCoinResultsFromNetwork()))
}
我在我的应用程序中将 Room 用于数据库层,并将 Retrofit 用于网络调用 - 在 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);
}
这是我的存储库:
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 network");
return api.getCoins().doOnNext(new Consumer<List<Coin>>() {
@Override
public void accept(List<Coin> coins) throws Exception {
System.out.println("inserting to db");
coinDao.insert(coins);
}
});
}
@Override
public Flowable<List<Coin>> getCoinResultsFromDatabase() {
System.out.println("getting coins from database");
return coinDao.getAllCoins();
}
}
我首先运行应用只用网络调用填充数据库
@Override
public Flowable<List<Coin>> getCoinResults() {
return getCoinResultsFromNetwork();
}
并且当执行网络调用时,数据已成功添加到数据库中 - 我 运行 应用程序再次仅从数据库中获取数据并且它也成功 - 数据是从数据库中获取的。
@Override
public Flowable<List<Coin>> getCoinResults() {
return getCoinResultsFromDatabase();
}
但是当我现在尝试做这样的事情时
return getCoinResultsFromDatabase.switchIfEmpty(getCoinResultsFromMemory));
问题是每次执行switchIfEmpty和每次执行"getCoinResultsFromMemory()"(即使数据库中的数据可用)。
根据https://medium.com/google-developers/room-rxjava-acb0cd4f3757 我读过当数据库中没有数据时 Flowable 不会发出任何东西,我应该使用 Maybe。但是为什么即使数据库中有数据,getResultsFromMemory() return 还是空的?在这种情况下我应该如何使用 Maybe?
我尝试将 Flowable 更改为 Maybe
Maybe<List<Coin>> getCoinResultsFromDatabase()
并做这样的事情 - 从 maybe 访问结果并检查列表是否为空,但我不知道如何 return 在这种情况下可流动:
public Flowable<List<Coin>> getCoinResults() {
getCoinResultsFromDatabase().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<Coin>>() {
@Override
public void accept(List<Coin> coins) throws Exception {
System.out.println("returning coins from maybe" + coins.get(0).getId());
if (coins.isEmpty()) {
System.out.println("coin list is empty");
Flowable<List<Coin>> flowable = getCoinResultsFromNetwork();
} else {
Flowable<List<Coin>> flowable = getCoinResultsFromDatabase();
}
}
});
return flowable //how to access this flowable??
}
也许我遗漏了一些东西并且有更好更干净的解决方案。
您的代码有几个问题:
1.Looks 就像在房间 Flowable<List<Coin>> getAllCoins()
中总是 return 一些值:项目列表或空列表所以 Maybe
在这里没有帮助
2.In这段代码
@Override
public Flowable<List<Coin>> getCoinResults() {
System.out.println("getting coin results");
return getCoinResultsFromDatabase().switchIfEmpty(getCoinResultsFromNetwork())
}
当你调用 getCoinResults
方法时,getCoinResultsFromNetwork
被调用,而不是当 flowable 为空时(这是普通的 java 方法调用)
您需要执行延迟调用。最终的解决方案可能是这样的
@Override
public Flowable<List<Coin>> getCoinResults() {
System.out.println("getting coin results");
return getCoinResultsFromDatabase()
.filter(list -> !list.isEmpty())
.switchIfEmpty(
Flowable.defer(() -> getCoinResultsFromNetwork()))
}