bugfix> android > 投稿

Android Studio 3.6.3

使ってますRxJavaにいくつかのレコードを挿入するには天気そして予報テーブル。

これらのテーブル間には外部キーの関係があります。予報表には天気があります description 、 そしてその weatherId Forecastテーブルの外部キーです。

私がしていることを説明するコメントを書きました

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>
}

なぜ私が手に入れたのかと思っている List<Single<WeatherTable>> の中に onSuccess 。それは List<WeatherTable>

いくつかの質問:

  • なぜそれは List<Single<WeatherTable>> ではなく List<WeatherTable>
  • で何ができますか List<Single<WeatherTable>>
  • 提案をありがとう、

    回答 2 件
    • 変化する

             .flatMap { forecastList ->
                  Single.just(forecastList.map {
                      databaseService.weatherDao().getWeatherById(it.weatherId)
                  })
              }
      
      

             .flatMapIterable { forecastList -> forecastList }
              .flatMap {
                  databaseService.weatherDao().getWeatherById(it.weatherId).toObservable()
              }
              .toList()
      
      

    • あなたの問題はあなたが取ったflatMapの中にあります List そしてあなたは map (kotlin funtion)から List<Single> それは意味します Single.just() に変換されます Single<List<Single>> 簡単に修正でき、メソッドのリターンを変更できます getWeatherByIdweatherDaoWeatherTable の代わりに Single<WeatherTable>

      Single.just(forecastList.map {
                          databaseService.weatherDao().getWeatherById(it.weatherId)
                      })
      
      

    あなたの答え