Kotlin Anko 中 parseList,parseOpt,parseSingle 的区别与联系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/willway_wang/article/details/90113093

1. 前言

今天学习了 kotlin Anko 库的 sqlite 部分的知识,对于 parseListparseOptparseSingle 三者的区别,花了一点时间搞清楚了。

2. 正文

三者都是用来解析查询结果的。这是它们的共同之处。也就是说,当我们有了某个 Cursor 对象时,可以使用 parseListparseOptparseSingle 这三个函数来获取对应的数据对象。
但是,这三个函数是有很大的区别的,查看下表:

方法 描述
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. 最后

学习到一点,结合源码学习,可以更加清晰地理解。

参考

猜你喜欢

转载自blog.csdn.net/willway_wang/article/details/90113093