Android SQLite插入数据报datatype mismatch(code 20)错误求助
问题原因
- 主键类型不匹配:你建表时
id字段定义为INTEGER类型且设置了自增属性,但insertbudget方法接收的id参数是字符串类型,将字符串插入整数字段直接触发SQLITE_MISMATCH类型不匹配错误。且自增主键无需手动传值插入,手动传值反而容易出现主键重复的问题。 - (可选优化点)当前你存储的日期格式为
dd/MM/yyyy,后续如果需要按日期排序、筛选时间段,SQLite内置的日期函数无法直接识别该格式,会增加后续业务开发成本。
修复步骤
- 修改DBHelper中的插入方法,移除id参数和id插入逻辑:
// 修改方法签名,去掉id参数 public Boolean insertbudget(String date) { SQLiteDatabase DB = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); // 去掉contentValues.put("id", id);这行代码,自增主键会自动赋值 contentValues.put("date", date); long result=DB.insert("Budget",null, contentValues); return result != -1; }
- 修改主页面插入调用逻辑,不再传入id参数:
// 删掉idTXT参数 Boolean checkAdddata = DB.insertbudget(dateTXT);
- (推荐)统一日期存储为标准格式,修改日期选择回调的日期拼接逻辑:
mDateSetListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int month, int day) { month = month + 1; // 改为yyyy-MM-dd标准格式,补零对齐,方便后续SQL查询排序 String formatDate = String.format(Locale.getDefault(), "%04d-%02d-%02d", year, month, day); mDisplayDate.setText(formatDate); } };
如果前端需要展示dd/MM/yyyy格式的日期,单独做展示层的格式转换即可,不要存非标准格式到数据库。
常见日期存储方案对比
- 存TEXT类型的ISO标准日期(
yyyy-MM-dd/yyyy-MM-dd HH:mm:ss):可读性强,SQLite内置日期函数可以直接识别处理,适合绝大多数普通业务场景,开发成本最低。 - 存INTEGER类型的时间戳:将选中日期转成毫秒/秒级时间戳存储,排序、计算日期间隔的效率最高,缺点是直接查库时无法直观看到日期,需要额外转格式。
内容的提问来源于stack exchange,提问作者Rinka Wai
相关产品推荐
相关产品推荐

