2017-06-16 63 views
2

基本上,我想檢查我的數據庫中是否有數據,如果我沒有,請打一個api調用。我使用這個邏輯提出請求的API:Rxjava - 邏輯隔離

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()); 
    } 

有任何方式加入到這個兩個邏輯?基本上,配置驗證數據庫,只需要打電話,如果需要?

回答

3

您可以使用過濾器和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 ""; 
} 

您可以瞭解從這裏無功世界https://github.com/politrons/reactive

+0

我得到一個更線程問題:OnError Realm從不正確的線程訪問。領域對象只能在創建它們的線程上訪問。 java.lang.IllegalStateException:從不正確的線程訪問域。領域對象只能在創建它們的線程上訪問。 – rguerra

0

如果您願意爲您的項目添加一個依賴項,Store是一個非常好的解決方案。否則,我會推薦使用Repository模式中的概念。

1

看起來你需要的Repository Pattern

什麼這個模式它從數據源隔離的業務邏輯。所以你只是要求提供數據,而不關心數據來自哪裏。所以,你可以哈瓦是這樣的:

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(...).observeOn(...)必要