为什么Kotlin for Android Developers(书)需要再次添加扩展名parseList?

时间:2017-11-02 07:45:19

标签: android kotlin anko

我知道Anko提供了parseSingle,parseOpt和parseList的函数,我不明白为什么Android Developers(该书)的代码需要再次设计扩展parseList。

你可以告诉我吗?谢谢!

https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/data/db/ForecastDb.kt

override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use {

        val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?"
        val dailyForecast = select(DayForecastTable.NAME)
                .whereSimple(dailyRequest, zipCode.toString(), date.toString())
                .parseList { DayForecast(HashMap(it)) }

}

https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/extensions/DatabaseExtensions.kt

fun <T : Any> SelectQueryBuilder.parseList(parser: (Map<String, Any?>) -> T): List<T> =
        parseList(object : MapRowParser<T> {
            override fun parseRow(columns: Map<String, Any?>): T = parser(columns)
})

2 个答案:

答案 0 :(得分:3)

Anko的parseList需要MapRowParser,而不是函数。这简化了使用。使用Anko版本,你会写

.parseList { mapRowParser { DayForecast(HashMap(it)) } }

代替。这假设有一个像mapRowParser这样的构造函数,我在它们的源代码中找不到;否则,你可以写得很平凡。

或者更确切地说,它已经在示例代码中为您编写,而不是作为单独的函数:

fun <T> mapRowParser(parser: (Map<String, Any?>) -> T): MapRowParser<T> = 
    object : MapRowParser<T> {
        override fun parseRow(columns: Map<String, Any?>): T = parser(columns)
    }

如果这个功能已经不存在,我真的很惊讶(也许还有别的东西,但是什么?)。 OTOH,如果确实存在,Leiva应该使用它。

答案 1 :(得分:0)

如果期望得到简单的单列行结果,则可以使用现成的Anko解析器:

  • ShortParser
  • IntParser
  • LongParser
  • FloatParser
  • DoubleParser
  • StringParser
  • BlobParser

您的代码可能是:

val dailyForecast = select(DayForecastTable.NAME)
                .whereSimple(dailyRequest, zipCode.toString(), date.toString())
                .parseList(StringParser)

或者您可以实现自己的解析器。下面是三列结果(Int,String,String)的示例:

val userParser = rowParser { id: Int, name: String, email: String ->
    Triple(id, name, email)
}