Flutter向SQLite的histories_table插入数据未持久保存如何解决
插入数据未保存到example.db的解决方案
- 首先验证插入操作的执行状态,你当前代码没有判断insert返回值也没有捕获异常,先修改插入逻辑增加排查日志:
Future<void> insertDB(int ftsId) async { try { final db = await ConectionDB.dbPro.databaseUser; // 先打印当前连接的数据库路径,确认是目标example.db print('当前操作数据库路径:${db.path}'); DateTimeHelper helper = DateTimeHelper(); DateTime now = DateTime.now(); String createdAt = helper.formatDateTime(now.toString()); Map<String, dynamic> row = { 'fts_main_content_id': ftsId, 'createdAt': createdAt, }; // insert方法成功返回插入行的id,失败返回-1 final insertRes = await db.insert( tableName, row, // 可选:指定冲突处理策略,避免主键重复时静默失败 conflictAlgorithm: ConflictAlgorithm.replace, ); print('插入操作结果:$insertRes'); final queryRes = await db.query(tableName); print('表内当前数据量:${queryRes.length}'); } catch (e) { print('插入操作报错:$e'); } }
- 如果插入返回值为-1,说明插入操作直接失败,优先检查表结构:执行
PRAGMA table_info(histories_table)查看histories_table的字段定义,确认是否存在未设置默认值的非空字段你没有传入,或者字段名拼写和row中的键不匹配,比如是否把created_at写成了createdAt。 - 如果插入返回正整数,运行时查询也能查到数据,但是查看本地的example.db文件没有数据,说明你连接的数据库和你查看的不是同一个文件:移动端SQLite默认存储在应用沙盒目录下,项目预置的example.db只是初始模板,运行时操作的是拷贝到沙盒里的副本,需要导出沙盒内的数据库文件才能看到实际写入的数据。
- 检查上层调用逻辑是否包裹了未提交的事务:如果insertDB的调用上下文开启了事务但没有执行commit,所有写入操作会在事务结束后自动回滚,不会持久化到磁盘。
- 确认
ConectionDB.dbPro.databaseUser对应的数据库实例正确,没有连接错其他数据库文件。
内容的提问来源于stack exchange,提问作者LihnNguyen
相关产品推荐
相关产品推荐

