1. 前言
今天学习了 kotlin Anko 库的 sqlite 部分的知识,对于 parseList
,parseOpt
,parseSingle
三者的区别,花了一点时间搞清楚了。
2. 正文
三者都是用来解析查询结果的。这是它们的共同之处。也就是说,当我们有了某个 Cursor
对象时,可以使用 parseList
,parseOpt
,parseSingle
这三个函数来获取对应的数据对象。
但是,这三个函数是有很大的区别的,查看下表:
方法 | 描述 |
---|---|
parseSingle(rowParser): T | 正好解析一行 |
parseOpt(rowParser): T? | 解析 0 行或者 1 行 |
parseList(rowParser): List<T> | 解析 0 行或者多行 |
从上面的表里,可以大致看到它们之间的区别了。这里还是做一下说明:
parseSingle(rowParser): T
,作用是正好解析一行,它的返回是非空类型的,如果把它用于解析 非 1 行的情况,它会抛出异常,可以查看下面的代码:
fun <T: Any> Cursor.parseSingle(parser: MapRowParser<T>): T = AnkoInternals.useCursor(this) {
if (count != 1)
throw SQLiteException("parseSingle accepts only cursors with getCount() == 1")
moveToFirst()
return parser.parseRow(readColumnsMap(this))
}
parseOpt(rowParser): T?
,解析 0 行或者 1 行,它的返回值是可空类型;当解析 0 行时,会返回null
;而当解析到大于 1 行时,也会抛出异常。
fun <T: Any> Cursor.parseOpt(parser: MapRowParser<T>): T? = AnkoInternals.useCursor(this) {
if (count > 1)
throw SQLiteException("parseSingle accepts only cursors with getCount() == 1 or empty cursors")
if (count == 0)
return null
moveToFirst()
return parser.parseRow(readColumnsMap(this))
}
parseList(rowParser): List<T>
,解析 0 行或者多行,它的返回值是非空类型;并且不会抛出异常。
fun <T: Any> Cursor.parseList(parser: MapRowParser<T>): List<T> = AnkoInternals.useCursor(this) {
val list = ArrayList<T>(count)
moveToFirst()
while (!isAfterLast) {
list.add(parser.parseRow(readColumnsMap(this)))
moveToNext()
}
return list
}
3. 最后
学习到一点,结合源码学习,可以更加清晰地理解。
参考
- Anko SQLite Wiki
- 《Kotlin For Android Developers》