SQLite数据库新增Codice列后插入数据报错:表Cuccioli无该列
解决SQLite表新增列后插入数据报错的问题
这个问题我开发Android应用时也碰到过一模一样的情况,本质是SQLite数据库的表结构不会自动更新——你虽然修改了创建表的代码,但设备上已经存在的旧数据库还是原来的结构(没有Codice列),所以插入数据时才会触发报错。下面给你分步解决的方案:
第一步:确认创建表的语句是否正确
先检查你的CREATE TABLE语句,确保已经包含了Codice列的定义,比如:
private static final String CREATE_TABLE_CUCCIOLI = "CREATE TABLE Cuccioli (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "Nome TEXT," + "Sesso TEXT," + "Razza TEXT," + "Codice TEXT)"; // 这里必须明确添加Codice列的类型
第二步:根据应用阶段选择处理方式
情况1:开发阶段(仅测试用)
这时候最简单的处理方式是卸载应用后重装,或者在设备的「应用设置」里找到你的应用,清除它的数据。这样旧的数据库文件会被彻底删除,下次启动应用时会用新的CREATE TABLE语句创建包含Codice列的表。
情况2:应用已发布(需要保留用户数据)
这种情况下绝对不能直接删除数据库,必须通过SQLiteOpenHelper的onUpgrade方法来安全升级表结构,添加新列:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 假设你之前的数据库版本是1,现在升级到2 if (oldVersion < 2) { // 给Cuccioli表新增Codice列 db.execSQL("ALTER TABLE Cuccioli ADD COLUMN Codice TEXT"); } }
同时要记得把SQLiteOpenHelper构造方法里的数据库版本号加1,比如:
public MyDatabaseHelper(Context context) { super(context, "MyDatabase.db", null, 2); // 版本号从原来的1改成2 }
为什么会出现这个错误?
SQLite是文件型数据库,一旦数据库文件在设备上创建完成,表结构就固定了。你修改代码里的CREATE TABLE语句后,只有当数据库文件不存在时,SQLiteOpenHelper才会调用onCreate方法重新创建表;如果旧数据库已经存在,只会调用onUpgrade(如果版本号提升了)或者直接沿用旧表结构,这就导致新添加的Codice列在旧表中不存在,插入数据时触发报错。
内容的提问来源于stack exchange,提问作者Sab Biuzzino
相关产品推荐
相关产品推荐

