使用 concat 从 DB 请求数据,如果它从 Service 中空获取不工作?

Using concat for requesting Data from DB and if it empty fetch from Service not working?

我需要从本地存储请求,如果它是空的,我应该请求服务并存储在数据库中,但如果数据库不为空,我应该忽略第二部分。 我正在使用房间持久性数据库 (Flowable),我的意思是如果我存储在数据库中,我可以听到变化。 我正在使用 concat,但较晚的部分正在工作

 val item1 = itemDao.loadItem(id)
 val item2 = apiIcaSeResource
    .fetchItem(offerId)
    .toFlowable()
    .doOnNext { item ->itemDao.saveItem(Item(...) }


 Flowable.concat(item1, item2)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({
      //          items ->
    }, {
      Timber.e(it, "Error reading items")
    })

  @Query("SELECT * FROM offer WHERE id = :offerId")
 fun loadItem( offerId: String): Flowable<Item>

@Insert(onConflict = OnConflictStrategy.REPLACE)
  fun saveItem(items: Item)


  @GET("item/{itemId}")
 Single<Item> fetchItem(@Path("itemId") Long itemId);
@Query("SELECT * FROM offer WHERE id = :offerId")
fun loadItem( offerId: String): Flowable<Item>

使用这样定义的 Room DAO,如果一个项目不存在,Flowable 将不会发出任何信息。不会有 onNext 事件。也定义为 Flowable 房间从不发出 onComplete.

Flowable.concat 等待第一个 Flowable 发出 onComplete 然后订阅第二个 Flowable 并发出所有项目。

因为 alpha5 您可以将 Room 中的 return 类型指定为 Maybe<Item> 这样您就可以检测数据库中是否存在现有项目。另一种选择是将 return 类型定义为 Flowable<List<Item>>,如果该项目在数据库中不存在,Room 将发出一个空列表。

如果您将 Room 切换为:

 @Query("SELECT * FROM offer WHERE id = :offerId")
 fun loadItem( offerId: String): Flowable<List<Item>>

您可以这样做(仅当数据库中有 0 个项目时才调用 API):

item1.flatMap { if(it.size == 0) item2 else Flowable.just(it) }

请注意,如果 API 调用中出现错误,这将结束流。检查 onErrorXXX 运算符以解决该问题。