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

Android中SQLite判断用户存在报错及游标关闭问题咨询

解决你的登录应用SQLite错误及游标疑问

一、SQLite错误原因及修复

你的LogCat错误android.database.sqlite.SQLiteException: no such column: ss是因为直接将字符串变量拼接到SQL语句中,导致SQL把输入的"ss"当成了列名,而不是字符串值。

比如你的原语句被解析成:

select * from user_table where username = ss and password = ss

SQL会认为ss是列名,但你的表中并没有名为ss的列,所以触发了报错。

正确的做法:使用参数化查询

参数化查询不仅能解决这个语法错误,还能防止SQL注入攻击,是操作SQLite的最佳实践。

修复后的Database.kt代码(推荐用Kotlin的use自动关闭游标):

fun userPresent(user: String, pass: String): Boolean { 
    val db = writableDatabase 
    // 用?作为占位符,通过数组传递实际参数
    val query = "select * from $TABLE_NAME where username = ? and password = ?" 
    // use函数会自动在代码块执行完后关闭cursor,无需手动调用close()
    return db.rawQuery(query, arrayOf(user, pass)).use { cursor ->
        cursor.count > 0
    }
}

或者用SQLite提供的query方法,可读性更强:

fun userPresent(user: String, pass: String): Boolean { 
    val db = writableDatabase 
    val selection = "username = ? AND password = ?"
    val selectionArgs = arrayOf(user, pass)
    
    return db.query(
        TABLE_NAME,
        null, // 仅判断存在的话,可传null或只查询一列
        selection,
        selectionArgs,
        null,
        null,
        null
    ).use { cursor ->
        cursor.count > 0
    }
}

二、为什么必须关闭游标?

Cursor是SQLite查询返回的结果集对象,它持有数据库的底层连接资源。如果不关闭:

  • 会造成资源泄漏,长时间运行后可能耗尽数据库连接池,导致后续数据库操作失败;
  • 可能引发内存泄漏,拖慢应用性能甚至导致崩溃。

Kotlin中的use扩展函数是处理这类资源的最优方案——它会在代码块执行完毕后自动调用close(),哪怕发生异常也能保证资源被释放。

三、额外建议

  • 密码存储安全:当前代码直接存储明文密码,风险极高。建议用哈希算法(如SHA-256)加盐后再存储密码,避免数据泄露带来的危害。
  • 你的MainActivity代码逻辑没问题,只要修复userPresent方法,就能正常完成登录判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:23