Flutter开发中如何给sqflite已创建完成的数据表新增列?
问题原因
你修改了建表语句,但create方法仅在数据库首次创建时执行,App本地已经存在旧版本数据库的情况下,不会触发重新建表,因此旧表缺少phone字段,才会抛出字段不存在的报错。
解决方法
方法1:直接执行ALTER TABLE命令新增/修改列(适合小版本迭代)
SQLite 原生支持ALTER TABLE语法修改现有表结构,新增列的语法为:ALTER TABLE 表名 ADD COLUMN 列名 类型 约束;
你要新增phone字段可以直接执行以下SQL:
ALTER TABLE table_x ADD COLUMN phone TEXT NOT NULL DEFAULT '';
注意:如果新增列设置了NOT NULL非空约束,必须指定默认值,否则旧表已存在的行没有对应字段值会触发报错。
方法2:配置数据库版本号走官方升级流程(sqflite 推荐生产环境方案)
你使用的是Flutter sqflite库的话,官方提供了版本号机制处理数据库升级,操作步骤如下:
- 打开数据库时将版本号+1,比如原有版本号是1,现在修改为2
- 实现
onUpgrade回调,在旧版本升级到新版本时执行加字段的SQL
示例代码如下:
final db = await openDatabase( 'your_database_path.db', version: 2, // 版本号从1升级为2 onCreate: (db, version) async { // 这里放最新的建表语句,新用户安装直接走这里创建全字段的表 await db.execute(''' CREATE TABLE $table ( $id INTEGER PRIMARY KEY, $name TEXT NOT NULL, $addr TEXT NOT NULL, $phone TEXT NOT NULL ) '''); }, onUpgrade: (db, oldVersion, newVersion) async { if (oldVersion < 2) { // 旧版本用户升级时执行加字段逻辑 await db.execute('ALTER TABLE table_x ADD COLUMN $phone TEXT NOT NULL DEFAULT ""'); } // 后续有更高版本升级需求,可继续增加判断分支 }, );
方法3:删表重建(仅适合开发测试阶段使用,正式上线不要用)
如果还在开发阶段不需要保留用户数据,可以直接卸载App重装,或者在升级回调中先删除旧表再重新建表,操作代码如下:
onUpgrade: (db, oldVersion, newVersion) async { await db.execute('DROP TABLE IF EXISTS $table'); // 执行最新建表语句 await db.execute(''' CREATE TABLE $table ( $id INTEGER PRIMARY KEY, $name TEXT NOT NULL, $addr TEXT NOT NULL, $phone TEXT NOT NULL ) '''); }
修改现有列属性的方案
SQLite 的ALTER TABLE支持的操作有限,无法直接修改已有列的类型、约束、名称,遇到这类需求需要按以下步骤操作:
- 创建符合新结构的临时表
- 将旧表的数据导入临时表
- 删除旧表
- 将临时表重命名为原表的名称
内容的提问来源于stack exchange,提问作者wahyu
相关产品推荐
相关产品推荐

