Android SQLite调用execSQL插入数据时VARCHAR附近报语法错误如何解决?
问题原因
你编写的INSERT SQL语句不符合语法规范:INSERT语句的字段列表仅需要填写字段名,字段类型是建表阶段声明的内容,不需要在插入语句里重复指定。你在$SWITCH_TABLE_NAME_COLUMN后多加了VARCHAR、在$SWITCH_TABLE_ISCHECKED_COLUMN后多加了INTEGER,就是触发语法报错的直接原因。
修复代码
直接删除插入语句中字段名后的类型声明即可:
fun changeSwitchValue(switchName: String, status: Int) { val db: SQLiteDatabase = this.writableDatabase db.execSQL( "INSERT INTO $TABLE_NAME ($SWITCH_TABLE_NAME_COLUMN, $SWITCH_TABLE_ISCHECKED_COLUMN) VALUES ('$switchName', $status)" ) Log.i(TAG, "Active Switches array now is: ${queryActiveSwitches()}") }
更优实现方案
直接拼接SQL字符串存在SQL注入风险,且容易出现语法错误,更推荐使用官方提供的insertAPI实现插入操作,不需要手动编写SQL:
fun changeSwitchValue(switchName: String, status: Int) { val db = writableDatabase val contentValues = ContentValues().apply { put(SWITCH_TABLE_NAME_COLUMN, switchName) put(SWITCH_TABLE_ISCHECKED_COLUMN, status) } // 返回值为新插入行的ID,返回-1则代表插入失败 val insertResult = db.insert(TABLE_NAME, null, contentValues) Log.i(TAG, "插入结果:$insertResult,Active Switches array now is: ${queryActiveSwitches()}") }
内容的提问来源于stack exchange,提问作者Binyamin Robbins
相关产品推荐
相关产品推荐

