如何在SQLite表中添加变量?存储ArrayList报inputString列不存在错误怎么解决
问题排查与修复方案
1. 报错E/SQLiteLog: (1) no such column: inputString的解决
- 当前贴出的插入逻辑使用
ContentValues实现参数化拼接,本身不会出现把字段值识别为列名的问题,该报错大概率由两个原因导致:- 之前测试时写过直接拼接SQL的插入语句,把
inputString变量直接写到SQL语句里未加引号,被SQLite识别为列名 - 修改过表结构但没有卸载重装测试应用,
CREATE TABLE IF NOT EXISTS只会在表不存在时执行,旧的表结构残留导致列不匹配
- 之前测试时写过直接拼接SQL的插入语句,把
- 修复操作:先把测试应用从模拟器/真机完全卸载,再重新运行安装,避免旧表结构残留
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
相关产品推荐
相关产品推荐

