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

使用execSQL插入数据库:CITY参数致应用崩溃原因咨询

为什么设置CITY参数时execSQL插入会崩溃?

这种情况我碰到过好多次,大概率是直接拼接SQL语句时没处理特殊字符或者语法错误导致的,下面给你拆解常见原因和解决办法:

最常见的原因:特殊字符破坏SQL语法

如果你的CITY值里包含单引号(比如O'Conner)、双引号或者其他SQL特殊字符,直接把它拼进SQL字符串里会导致语句结构错乱。举个例子:
你原本想写的SQL是:

INSERT INTO locations (CITY) VALUES ('O'Conner')

但这里的第二个单引号会提前闭合字符串,剩下的Conner')就成了无效语法,数据库执行时直接抛出异常,导致APP崩溃。

其他可能的原因

  • 忘记给字符串加引号:如果你的SQL写成了INSERT INTO locations (CITY) VALUES (London),数据库会把London当成列名而非字符串值,直接触发语法错误。
  • 空值处理不当:如果CITY是null,直接拼接可能变成VALUES (null)(这其实没问题),但如果你错误地把它转成了字符串'null',就会插入字符串"null"而非空值;或者如果字段不允许空,但你传入了null,也会触发约束异常。
  • 数据类型不匹配:比如CITY字段定义的是整数类型,但你传入了字符串值,数据库类型校验失败也会导致崩溃。

正确的解决办法:用参数化查询

别再直接拼接SQL了!用execSQL的参数化版本,或者ContentValues来插入,既能避免SQL注入,又能完美处理特殊字符:

方法1:带参数的execSQL

String sql = "INSERT INTO locations (CITY) VALUES (?)";
db.execSQL(sql, new Object[]{cityValue});

这里的?是占位符,数据库会自动处理特殊字符、引号和类型转换,完全不用担心语法问题。

方法2:用ContentValues(更推荐)

ContentValues values = new ContentValues();
values.put("CITY", cityValue);
db.insert("locations", null, values);

这种方式Android会帮你处理所有SQL语法细节,代码更简洁也更安全。

内容的提问来源于stack exchange,提问作者Hossein Mozaffari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:04:22