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
相关产品推荐
相关产品推荐

