Android API 28 SQLiteException报错:SQL语句适配修改咨询
问题分析
崩溃原因很明确:你直接把布尔值true拼接到SQL语句里,SQLite会将true解析成列名而非布尔值,所以抛出no such column: true错误。API 29+的SQLite可能做了兼容处理,自动将true转为整数1,但API 28及以下没有这个兼容逻辑,导致崩溃。
另外你的代码逻辑存在多处错误:
- 用
update语句调用getData(查询方法):update是写操作,不会返回游标,这完全不符合SQL操作规范。 - 调用
sd.update时错误地将完整update语句作为whereClause参数,会导致语法错误。
修正方案
直接使用Android提供的ContentValues配合update方法(推荐,避免SQL注入和类型错误),同时修正查询逻辑:
// 1. 先查询是否存在目标记录(用select语句) String query = "SELECT 1 FROM " + TABLE_DOCTOR + " WHERE " + Queryclass.DOCTOR_CONTACTID + " = ?"; cursor = sd.getData(query, new String[]{String.valueOf(gspid)}); // 用参数化查询避免拼接问题 if (cursor.moveToNext()) { // 2. 存在则执行更新 ContentValues contentValues = new ContentValues(); contentValues.put(Queryclass.DOCTOR_ROGSP_STATUS, true); // ContentValues会自动处理布尔值为1/0 // update方法参数:表名、ContentValues、where条件、where参数 sd.update(Queryclass.TABLE_DOCTOR, contentValues, Queryclass.DOCTOR_CONTACTID + " = ?", new String[]{String.valueOf(gspid)}); } cursor.close(); sd.close();
如果一定要用原生SQL语句,需要把布尔值转为整数1(SQLite中true对应1,false对应0):
// 拼接时将布尔值转为整数 String query = "UPDATE " + TABLE_DOCTOR + " SET " + Queryclass.DOCTOR_ROGSP_STATUS + " = " + (isFiled ? 1 : 0) + " WHERE " + Queryclass.DOCTOR_CONTACTID + " = " + gspid; // 执行update语句应该用execSQL而非getData(getData是查询用的) sd.execSQL(query);
关键注意点
- 永远不要直接拼接变量到SQL语句中,既容易出现类型错误,还存在SQL注入风险,优先使用参数化查询或
ContentValues。 - 区分SQL的读操作(select)和写操作(insert/update/delete),写操作不要调用查询方法,应该用
execSQL或对应的insert/update/delete封装方法。
内容的提问来源于stack exchange,提问作者Abm
相关产品推荐
相关产品推荐

