Flutter sqflite报错:类‘Type’未定义‘execute’方法,如何解决?
解决sqflite中"The method 'execute' isn't defined for the type 'Type'"报错
错误原因
报错出现在addSalaryColumn方法中,你直接写了await Database尝试获取数据库实例——这里的Database是类型标识而非实际的数据库对象,类型本身没有execute方法,因此触发该错误。
修复步骤
1. 修正addSalaryColumn方法
把获取数据库实例的代码替换成调用类内的getInstance getter方法:
Future<void> addSalaryColumn() async { final db = await getInstance; // 替换原有的final db = await Database; await db?.execute( "ALTER TABLE PERSON ADD COLUMN salary INTEGER DEFAULT 0" ); }
这里加?是因为getInstance返回Database?,避免空指针风险。
2. 同步修复代码其他问题
你的代码还有几处语法和规范问题,修正后更健壮:
- 补全
getInstance方法中if分支的闭合} - 给
instance方法添加返回值类型Future<Database> - 规范
onCreate中的SQL语句包裹格式,用三个单引号完整包裹多段SQL - 用
//规范注释格式
修正后的完整代码:
import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; class LiteDb { static Database? _db; Future<Database?> get getInstance async { if (_db == null) { _db = await instance(); return _db; } else { return _db; } } Future<void> addSalaryColumn() async { final db = await getInstance; await db?.execute( "ALTER TABLE PERSON ADD COLUMN salary INTEGER DEFAULT 0" ); } Future<Database> instance() async { // 获取数据库存储路径 var databasesPath = await getDatabasesPath(); String path = join(databasesPath, 'lite_sql.db'); // 打开数据库 Database database = await openDatabase(path, version: 2, onCreate: (Database db, int version) async { // 创建表 await db.execute(''' CREATE TABLE PERSON (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER); CREATE TABLE ACCOUNT (id INTEGER PRIMARY KEY AUTOINCREMENT, PERSON_ID INTEGER NOT NULL, ACCOUNT INTEGER NOT NULL, VALUE REAL); '''); print('数据库已创建'); }, onUpgrade: (Database db, int oldVersion, int newVersion) async { if (newVersion >= 2) { await db.execute(''' ALTER TABLE PERSON ADD COLUMN salary REAL NULL '''); } } ); print('数据库已连接'); return database; } Future<List<Map>> inquiry(String sqlTxt) async { Database? db = await getInstance; // 查询记录 List<Map> list = await db!.rawQuery(sqlTxt); return list; } Future<int> insert(String sqlTxt) async { Database? db = await getInstance; // 插入记录 int count = await db!.rawInsert(sqlTxt); return count; } Future<int> update(String sqlTxt) async { Database? db = await getInstance; // 更新记录 int count = await db!.rawUpdate(sqlTxt); return count; } Future<int> delete(String sqlTxt) async { Database? db = await getInstance; // 删除记录 int count = await db!.rawDelete(sqlTxt); return count; } }
关键提示
- 永远不要直接用
Database类型调用实例方法,必须通过openDatabase或自定义单例方法获取实际的数据库实例 - 异步方法要正确使用
await,同时处理可能的空值(比如用?.规避空指针)
内容的提问来源于stack exchange,提问作者sayedoon ali
相关产品推荐
相关产品推荐

