【发布时间】:2020-09-21 15:25:13
【问题描述】:
我正在尝试将使用 Retrofit 进行 API 请求的现有工作代码与 Android 中的 SQLite Room 集成。
val apiInterface = ApiInterface.create()
val requests = ArrayList<Observable<Business>>()
requests.addAll(DB.getAllBusinessEntry().map { // fun getAllBusinessEntry(): List<BusinessEntry>
apiInterface.getBusiness(it.major, it.minor)
})
Observable.zip(requests)
{ objects ->
val businesses = ArrayList<Business>()
objects.forEach { businesses.add(it as Business) }
return@zip businesses
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
businessAdapter.updateElements(it)
}
BusinessEntry 是一个包含主键(major 和 minor)的数据类,允许执行 API 请求以获取业务详细信息(存储在 Business 中)。
DB.getAllBusinessEntry() 是一个函数,它使用 Android 文档中记录的 DB Helper 类来访问应用程序内部的 SQLite 数据库。
我想将此代码迁移到 Room 并依赖 RxJava 功能,但我不知道如何在 ApiInterface 调用中转换每个 BusinessEntry。
下面是BusinessDao接口
import androidx.room.Dao
import androidx.room.Query
import io.reactivex.rxjava3.core.Observable
@Dao
interface BusinessDao {
@Query("SELECT * FROM Entry")
fun getAll(): Observable<List<Entry>>
}
我正在使用 Room 2.3.0-alpha02
编辑:根据 cmets 的建议,我已经实现了这一点,但仍然无法正常工作,因为在最后的 subscribe 调用 businessList 是 List<Observable<Business>!>! 类型,而它应该是 @ 987654334@
swipeRefreshLayout?.isRefreshing = true
val apiInterface = ApiInterface.create()
businessDB.businessDao().getAll()
.flatMapSingle { entries ->
Observable.fromIterable(entries)
.map { apiInterface.getBusiness(it.major, it.minor) }
.toList()
}
.map { it.filter { true } }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { businessList ->
swipeRefreshLayout?.isRefreshing = false
businessAdapter.updateElements(businessList) // <-- type error here
}
【问题讨论】:
标签: android retrofit2 rx-java android-room