SQLite查询在Android4.4正常,Android5.0及以上报歧义列错误
问题原因及解决方案
这个问题其实和Android自带的SQLite版本升级以及解析规则的严格化有关,并非SQLite官方文档里标注的核心功能变更哦,具体原因和解决方法如下:
1. Android 5.0的SQLite版本迭代带来的严格检查
Android 4.4及以下系统搭载的是SQLite 3.7.x版本,而Android 5.0及以上直接升级到了SQLite 3.8.x版本。这个版本的SQLite对查询中歧义列的校验变得更严格:
- 在旧版本的SQLite中,当多个关联表存在同名列(比如你遇到的
number列),使用select *时,SQLite会默认选取某个表的列而不抛出错误; - 但SQLite 3.8.x开始,只要检测到查询中有多个表包含同名且未明确归属的列,就会直接抛出
android.database.sqlite.SQLiteException: ambiguous column name异常,因为它要求开发者明确指定列所属的表。
2. 你的查询片段中的问题点
从你给出的查询片段来看,查询里嵌套了子查询,并且关联了numbers和contacts表,同时外层查询涉及的表(比如CNCT)大概率也包含number列。当你用select *查询所有列时,SQLite 3.8.x无法确定你要获取哪个表的number列,因此触发了歧义报错,而旧版本的宽松校验让这个问题被掩盖了。
3. 快速解决方法
- 避免使用
select *:明确列出你需要的所有列,对有歧义的列加上表别名或表名前缀,比如写成CNCT._id, nm.number, cot.name...,让SQLite清楚知道每一列的来源; - 若必须查询所有列:对重复列手动指定别名区分,比如
select CNCT.*, nm.number as numbers_number, cot.*...,这样就能避免列名冲突。
内容的提问来源于stack exchange,提问作者user8141097
相关产品推荐
相关产品推荐

