为什么 Kotlin for Android Developers(本书)需要再次添加扩展 parseList?
Why does Kotlin for Android Developers (the book) need to add extensions parseList again?
我知道Anko提供了parseSingle、parseOpt和parseList函数,我不明白为什么Android开发者(书)的代码需要重新设计扩展parseList。
你能告诉我吗?谢谢!
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)) }
}
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)
})
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 应该使用它。
如果您希望得到简单的单列行结果,您可以使用现成的 Anko 解析器:
- ShortParser
- IntParser
- 长解析器
- 浮动解析器
- 双解析器
- 字符串解析器
- Blob 解析器
您的代码可能是:
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)
}
我知道Anko提供了parseSingle、parseOpt和parseList函数,我不明白为什么Android开发者(书)的代码需要重新设计扩展parseList。
你能告诉我吗?谢谢!
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)) }
}
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)
})
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 应该使用它。
如果您希望得到简单的单列行结果,您可以使用现成的 Anko 解析器:
- ShortParser
- IntParser
- 长解析器
- 浮动解析器
- 双解析器
- 字符串解析器
- Blob 解析器
您的代码可能是:
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)
}