【发布时间】:2020-05-18 02:03:50
【问题描述】:
Android Studio 3.6.3
我正在使用 RxJava 将一些记录插入到 weather 和 forecast 表中。
这些表之间存在外键关系。预测表有天气description,weatherId 是预测表中的外键。
我已经写了 cmets 来解释我在做什么
private fun createWeatherForecast() {
val disposable = databaseService
.weatherDao()
// Insert the weather description
.insert(WeatherTable(icon= "icon", code = (10..1000).shuffled().first(), description = "cloudy with a chance of meatballs"))
// Insert the Forecast. A weather ID is returned and used as a foregin key in the forecast table.
.flatMap { weatherId ->
databaseService.forecastDao().insert(
ForecastTable(
temp = 45.2F,
highTemp = 50.5F,
lowTemp = 34.8F,
feelLikeMinTemp = 30.5F ,
feelLikeMaxTemp = 49.9F,
validDate = "today",
weatherId = weatherId)
)
}
// Get the forecast weather from the Forecast Table
.flatMap {
databaseService.forecastDao().getAllForecast()
}
// Get the weather by WeatherID that was inserted in the Forecast table and loop
.flatMap { forecastList ->
Single.just(forecastList.map {
databaseService.weatherDao().getWeatherById(it.weatherId)
})
}
.subscribeOn(schedulerProvider.backgroundScheduler())
.observeOn(schedulerProvider.uiScheduler())
.subscribeBy(
// This is the confusion as I expect a List<WeatherTable> but instead its List<Single<WeatherTable>>
onSuccess = {
println("Weather forecast $it")
},
onError = { println(it.message) }
)
}
这是 WeatherTable 的 dao
@Dao
interface WeatherDao : BaseDao<WeatherTable> {
@Query("SELECT * FROM weatherTable")
fun getAllWeather(): Single<List<WeatherTable>>
@Query("SELECT * FROM weatherTable WHERE id = :id LIMIT 1")
fun getWeatherById(id: Long): Single<WeatherTable>
@Query("SELECT count(*) FROM weatherTable")
fun count(): Single<Int>
}
只是想知道为什么我在onSuccess 中得到一个List<Single<WeatherTable>>。我觉得应该是List<WeatherTable>。
只是一些问题:
- 为什么是
List<Single<WeatherTable>>而不是List<WeatherTable>? -
List<Single<WeatherTable>>可以做什么?
非常感谢您的任何建议,
【问题讨论】:
-
getWeatherById 是 Single
对吗? -
是的,看起来是这样的:
@Query("SELECT * FROM weatherTable WHERE id = :id LIMIT 1") fun getWeatherById(id: Long): Single<WeatherTable>