Android SQLite更新数据库版本后插入数据报near "0"语法错误无法存储
问题根因与修正方案
核心错误点
建表语句错误拼接导致非法列名
在Database类的onCreate方法中,你原本想把KEY_CODE(值为字符串"code")作为表列名拼接到建表SQL中,却错误调用了Integer.parseInt(KEY_CODE)做类型转换,直接把数字结果当成了列名。从异常日志的SQL可以确认,最终生成的表结构里存在列名0——SQLite中无引号包裹的数字不能作为合法列名,这就是触发near "0": syntax error的直接原因。错误代码片段:
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_USERID + " TEXT," + KEY_EMAIL + " TEXT," + Integer.parseInt(KEY_CODE) + " TEXT" + ")";自增主键逻辑冲突
你定义的KEY_ID是INTEGER PRIMARY KEY AUTOINCREMENT类型的自增主键,正常不需要手动赋值,但addUserInfo方法里却手动给这个字段传入了字符串类型的用户输入值,不符合表结构设计。旧表结构残留不匹配
升级数据库版本时,onUpgrade会先删表再调用onCreate重建表,但因为onCreate里的建表语句存在类型转换错误(Integer.parseInt("code")会直接抛出数字格式化异常),整个重建流程会因事务回滚失败,之前错误结构的旧表会残留在数据库中,和代码的表结构对不上。
修正步骤
- 修正
onCreate的建表语句,去掉多余的Integer.parseInt转换,直接拼接字符串常量作为列名:@Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_USERID + " TEXT," + KEY_EMAIL + " TEXT," + KEY_CODE + " TEXT" + ")"; db.execSQL(CREATE_TABLE); } - 修正
addUserInfo方法,移除对自增主键的手动赋值:public void addUserInfo(UserInfo info){ SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); // 删除手动给自增主键赋值的代码 contentValues.put(KEY_EMAIL, info.Email); contentValues.put(KEY_USERID, info.UserId); contentValues.put(KEY_CODE, info.CODE); db.insert(TABLE_NAME, null, contentValues); db.close(); } - 清空旧的错误数据库:将
DATABASE_VERSION的值从5调整为6,触发数据库升级流程,删除旧的错误结构表。如果是本地测试阶段,也可以直接卸载APP,清除本地数据库残留后重新运行。
内容的提问来源于stack exchange,提问作者user11852020
相关产品推荐
相关产品推荐

