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

如何在SQLite表中添加变量?存储ArrayList报inputString列不存在错误怎么解决

问题排查与修复方案

1. 报错E/SQLiteLog: (1) no such column: inputString的解决

  • 当前贴出的插入逻辑使用ContentValues实现参数化拼接,本身不会出现把字段值识别为列名的问题,该报错大概率由两个原因导致:
    • 之前测试时写过直接拼接SQL的插入语句,把inputString变量直接写到SQL语句里未加引号,被SQLite识别为列名
    • 修改过表结构但没有卸载重装测试应用,CREATE TABLE IF NOT EXISTS只会在表不存在时执行,旧的表结构残留导致列不匹配
  • 修复操作:先把测试应用从模拟器/真机完全卸载,再重新运行安装,避免旧表结构残留

2. 现有代码其他逻辑错误修复

  • 游标遍历逻辑错误:先执行了resultSet.moveToFirst(),后续又调用resultSet.moveToNext()会直接跳过第一条数据,修改遍历逻辑即可
  • Gson反序列化类型错误:要反序列化得到ArrayList对象,TypeToken的泛型不能写String,要和存入的itemOne的类型对应,比如存入的是ArrayList<String>就替换成对应泛型

修正后的完整代码

try {
    SQLiteDatabase database = this.openOrCreateDatabase("arrayList", MODE_PRIVATE, null);
    Gson gson = new Gson();
    // 这里itemOne是你要存的ArrayList对象,示例为ArrayList<String>类型
    String inputString = gson.toJson(itemOne);
    Log.i("InputString", inputString);

    database.execSQL("CREATE TABLE IF NOT EXISTS savedTasks(item VARCHAR)");
    ContentValues cv = new ContentValues();
    cv.put("item", inputString);
    database.insert("savedTasks", null, cv);

    Cursor resultSet = database.rawQuery("Select * from savedTasks", null);
    // 修正游标遍历逻辑
    while (resultSet.moveToNext()) {
        String getData = resultSet.getString(0);
        // TypeToken泛型和存入的ArrayList实际类型保持一致,示例为ArrayList<String>
        Type type = new TypeToken<ArrayList<String>>() {}.getType();
        ArrayList<String> parsedList = gson.fromJson(getData, type);
        arrayLists.addAll(parsedList);
        adapter.notifyDataSetChanged();
    }
    resultSet.close(); // 用完游标及时关闭避免内存泄漏
    Log.i("ArrayLists", String.valueOf(arrayLists));
} catch (Exception e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者easybeak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 07:45:03