使用 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
运算符以解决该问题。
我需要从本地存储请求,如果它是空的,我应该请求服务并存储在数据库中,但如果数据库不为空,我应该忽略第二部分。 我正在使用房间持久性数据库 (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
运算符以解决该问题。