首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么安卓开发人员的Kotlin (这本书)需要再次添加扩展parseList?

为什么安卓开发人员的Kotlin (这本书)需要再次添加扩展parseList?
EN

Stack Overflow用户
提问于 2017-11-02 07:45:19
回答 2查看 368关注 0票数 5

我知道Anko提供了parseSingle、parseOpt和parseList等功能,我不明白为什么安卓开发人员的代码(这本书)需要再次设计扩展parseList。

你能告诉我吗?谢谢!

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-02 13:35:53

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

代码语言:javascript
复制
.parseList { mapRowParser { DayForecast(HashMap(it)) } }

而不是。这是假设有一个像mapRowParser这样的构造函数,我在它们的源代码中找不到;否则,您可以非常琐碎地编写它。

或者说,它已经在示例代码中为您编写了,而不是作为一个单独的函数:

代码语言:javascript
复制
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应该使用它。

票数 3
EN

Stack Overflow用户

发布于 2018-09-17 19:38:31

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

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

您的代码可能是:

代码语言:javascript
复制
val dailyForecast = select(DayForecastTable.NAME)
                .whereSimple(dailyRequest, zipCode.toString(), date.toString())
                .parseList(StringParser)

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

代码语言:javascript
复制
val userParser = rowParser { id: Int, name: String, email: String ->
    Triple(id, name, email)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47070049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档