Flutter Sqflite Update方法无报错但不生效问题求助
问题排查与修复方案
核心问题1:SessionChunk构造函数未正确初始化字段
你的SessionChunk构造函数只对intention做了赋值,workTime、breakTime、progress这三个参数接收后完全没用到,导致从数据库查询出来的数据无法映射到对象实例中。不管grabLastChunk从数据库拿到的workTime是什么值,对象里的workTime始终是默认的0——后续你调用updateWorkTime把它改成50,但如果grabLastChunk没有正确获取到数据库中存在的记录(或者记录的intention不匹配),update操作根本找不到要修改的行,数据库自然不会有变化。
修复构造函数,改成直接初始化所有字段的形式:
class SessionChunk { String intention; int workTime; int breakTime; String progress; // 修正后的构造函数,直接初始化所有实例变量 SessionChunk({ required this.intention, this.workTime = 0, this.breakTime = 0, this.progress = "", }); // 其余方法保持不变... }
核心问题2:未验证update操作的执行结果
sqflite的update方法会返回受影响的行数,你可以通过打印这个值,快速判断update是否命中了目标行:
updateLastChunk() async { final db = await database; SessionChunk lastChunk = await grabLastChunk(); lastChunk.updateWorkTime(workTime: 50); print("this is the new value"); print(lastChunk.toMap()); // 新增:获取update返回的受影响行数 int rowsUpdated = await db.update('session', lastChunk.toMap(), where: 'intention = ?', whereArgs: [lastChunk.intention]); print('update done, affected rows: $rowsUpdated'); // 打印结果 }
- 如果输出
affected rows: 0:说明你的where条件没匹配到任何行,要么lastChunk.intention的值在数据库里不存在,要么grabLastChunk拿到的是一个不存在的记录。 - 如果输出
affected rows: 1:说明update已经生效,你需要检查查询数据库的代码是否有问题(比如查询时没正确读取workTime字段)。
辅助排查:检查grabLastChunk方法
如果rowsUpdated为0,大概率是grabLastChunk没有正确获取到数据库中已有的记录。确保它从数据库查询后,把所有字段都传入SessionChunk构造函数:
Future<SessionChunk> grabLastChunk() async { final db = await database; // 这里示例用limit 1取第一条,你可以根据实际逻辑调整排序/查询条件 List<Map<String, dynamic>> result = await db.query('session', limit: 1); if (result.isEmpty) { // 没有记录时的处理,比如抛出异常或创建默认对象 throw Exception("No session record found"); } // 必须把数据库查询到的所有字段传入构造函数 return SessionChunk( intention: result[0]['intention'], workTime: result[0]['workTime'], breakTime: result[0]['breakTime'], progress: result[0]['progress'], ); }
额外注意:确保数据库初始化完成
在调用任何数据库操作之前,必须等待initDatabase完成,比如在main函数中:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await initDatabase(); // 等待数据库初始化完成 runApp(MyApp()); }
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

