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

Android SQLite插入数据报datatype mismatch(code 20)错误求助

问题原因
  • 主键类型不匹配:你建表时id字段定义为INTEGER类型且设置了自增属性,但insertbudget方法接收的id参数是字符串类型,将字符串插入整数字段直接触发SQLITE_MISMATCH类型不匹配错误。且自增主键无需手动传值插入,手动传值反而容易出现主键重复的问题。
  • (可选优化点)当前你存储的日期格式为dd/MM/yyyy,后续如果需要按日期排序、筛选时间段,SQLite内置的日期函数无法直接识别该格式,会增加后续业务开发成本。
修复步骤
  1. 修改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;
}
  1. 修改主页面插入调用逻辑,不再传入id参数:
// 删掉idTXT参数
Boolean checkAdddata = DB.insertbudget(dateTXT);
  1. (推荐)统一日期存储为标准格式,修改日期选择回调的日期拼接逻辑:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:15:03