Android SQLite执行DROP COLUMN删除列报错ADD or RENAME expected如何解决
SQLite删除列报错ADD or RENAME expected, got 'DROP' 解决方案
报错的核心原因是:Android内置的SQLite版本普遍低于3.35.0,而ALTER TABLE ... DROP COLUMN语法是SQLite 3.35.0才新增的特性,低版本SQLite不支持该操作,因此直接执行删除列语句会触发语法错误。
正确实现方案
低版本SQLite删除列需要通过「建表-迁数据-删旧表-重命名」的流程完成,具体步骤如下:
- 创建不包含待删除
status列的临时新表 - 将旧表中需要保留的字段数据批量插入到新表
- 删除原有旧表
- 将临时新表重命名为原有表的名称
修正后代码
private static final String DATABASE_NAME = "Manager.db"; public static final String TABLE_NAME = "MANAGER_TABLE"; public static final String _ID = "_id"; public static final String STATUS = "status"; public DBHelper(@Nullable Context context) { super(context, DATABASE_NAME, null, 2); } @Override public void onCreate(SQLiteDatabase db) { // 新安装用户直接创建无STATUS列的表 String create_table = "CREATE TABLE " + TABLE_NAME + "( " + "ID INTEGER PRIMARY KEY ," + _ID + " TEXT NOT NULL)"; db.execSQL(create_table); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { // 1. 建临时新表,不含待删除的STATUS列 db.execSQL("CREATE TABLE MANAGER_TABLE_TEMP (ID INTEGER PRIMARY KEY, _id TEXT NOT NULL)"); // 2. 复制旧表保留字段的数据到新表 db.execSQL("INSERT INTO MANAGER_TABLE_TEMP (ID, _id) SELECT ID, _id FROM " + TABLE_NAME); // 3. 删除旧表 db.execSQL("DROP TABLE " + TABLE_NAME); // 4. 临时表重命名为原表名,完成列删除操作 db.execSQL("ALTER TABLE MANAGER_TABLE_TEMP RENAME TO " + TABLE_NAME); } }
注意:如果你的表还有其他需要保留的列,需要同步修改新建表的结构和数据复制语句的字段列表,避免数据丢失。
内容的提问来源于stack exchange,提问作者m umer
相关产品推荐
相关产品推荐

