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

