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

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. 最后

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

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

willwaywang6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值