基本上,我想检查我的数据库中是否有数据,如果我没有,请拨打api电话。我使用此逻辑向API发出请求:
private void requestDataToApi() {
mSubscribe = createRequest()
.delay(DELAY_SPLASH_SCREEN_SECONDS, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(categoryModels -> {
writeDataToDb(categoryModels);
}, (throwable -> {
dealError();
}));
}
这个逻辑验证是否存储了任何数据:
if (mRealm.where(CategoryModel.class).findAll().size() == 0) {
requestDataToApi();
} else {
getView().openMainActivity(readDataFromDb());
}
有什么方法可以加入这两种逻辑吗?基本上,如果需要,可以使用dispose验证数据库并进行调用吗?
答案 0 :(得分:3)
您可以使用filter和switchIfEmpty运算符
@Test
public void ifEmpty() throws InterruptedException {
Observable.just(getDataFromDatabase())
.filter(value -> !value.isEmpty())
.switchIfEmpty(Observable.just("No data in database so I go shopping"))
.subscribe(System.out::println);
}
private String getDataFromDatabase() {
if(new Random().nextBoolean()){
return "data";
}
return "";
}
了解更多来自被动世界的信息
答案 1 :(得分:1)
您似乎需要Repository Pattern
这种模式将业务逻辑与数据源隔离开来。因此,您只需要提供数据,而不关心这些数据的来源。所以你可能会有类似的东西:
session.send('Message with URL: https://botframework.com');
因此,您可以从业务层(或者在您的情况下,视图层)加载数据,以确保它已存储在本地。
不要忘记在必要时使用public class CategoryModelRepo {
public Observable<CategoryModel> getAll() {
return Observable.defer(() -> {
List<CategoryModel> fromRealm = mRealm.where(CategoryModel.class).findAll();
if (fromRealm.size() == 0) {
return requestDataToApi()
.onNext(dataList -> storeDataInRealm(dataList))
} else {
return Observable.just(fromRealm);
}
}
}
// This code fragment could be improved by applying a DAO pattern
// http://www.oracle.com/technetwork/java/dataaccessobject-138824.html
private Observable<CategoryModel> requestDataToApi() {
return createRequest()
.delay(DELAY_SPLASH_SCREEN_SECONDS, TimeUnit.SECONDS)
}
和.subscribeOn(...)
答案 2 :(得分:0)
如果您愿意为项目添加一个依赖项,Store是一个非常好的解决方案。否则,我建议使用Repository模式中的概念。