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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:55:15