gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 16:50:28 24 4
gpt4 key购买 nike

我需要从本地存储请求,如果它是空的,我应该请求服务并存储在数据库中,但如果数据库不为空,我应该忽略第二部分。我正在使用房间持久性数据库(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 中的返回类型指定为 Maybe<Item>这样您就可以检测数据库中是否存在现有项目。另一种选择是将返回类型定义为 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运营商解决这个问题。

关于android - 使用 concat 从 DB 请求数据,如果它从 Service 中空获取不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46615106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com