You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite中NULL值导致Kotlin Android应用崩溃的解决方法

解决SQLite查询NULL值导致Android应用崩溃的问题

问题原因

当SQLite列值为NULL时,cursor.getString()会返回null,而你的函数返回类型是非空String,Kotlin不允许将null赋值给非空类型,因此导致崩溃。同时原代码存在SQL注入风险,且未关闭Cursor可能引发资源泄漏。

解决方案

方法1:使用cursor.isNull判断NULL值+参数化查询

修改getWidth函数,先检查列是否为NULL,同时改用参数化查询避免SQL注入,并确保Cursor关闭:

fun getWidth(flange: String): String {
    val defaultWidth = "N/A"
    val db = readableDatabase
    // 仅查询需要的列,提升性能;用?占位符实现参数化查询
    val selectSql = "SELECT $COLUMN_WIDTH FROM $FLANGE_TABLE WHERE $COLUMN_FLANGE = ?"
    
    val cursor = db.rawQuery(selectSql, arrayOf(flange))
    return try {
        if (cursor.moveToFirst()) {
            val widthColumnIndex = cursor.getColumnIndexOrThrow(COLUMN_WIDTH)
            // 判断列值是否为NULL,是则返回默认值
            if (cursor.isNull(widthColumnIndex)) defaultWidth else cursor.getString(widthColumnIndex)
        } else {
            // 未查询到数据时也返回默认值
            defaultWidth
        }
    } finally {
        // 确保Cursor被关闭,避免资源泄漏
        cursor.close()
    }
}

方法2:利用Kotlin空安全操作符简化代码

借助Elvis操作符?:,直接处理cursor.getString()返回的null值,代码更简洁:

fun getWidth(flange: String): String {
    val defaultWidth = "N/A"
    val db = readableDatabase
    val selectSql = "SELECT $COLUMN_WIDTH FROM $FLANGE_TABLE WHERE $COLUMN_FLANGE = ?"
    
    return db.rawQuery(selectSql, arrayOf(flange)).use { cursor ->
        // use函数自动关闭Cursor,无需手动处理
        if (cursor.moveToFirst()) {
            // 若getString返回null,自动替换为默认值
            cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_WIDTH)) ?: defaultWidth
        } else {
            defaultWidth
        }
    }
}

关键优化点

  • NULL值处理:通过cursor.isNull判断或Elvis操作符,将null替换为"N/A"或空字符串等非空值。
  • SQL注入防护:禁止直接拼接用户输入到SQL语句,使用?占位符+参数数组的方式传递查询条件。
  • 资源管理:使用try-finally或Kotlin的use函数确保Cursor被关闭,避免数据库资源泄漏。

内容的提问来源于stack exchange,提问作者Whitt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:42:28