我发现大多数人只需通过处理 Moor 中的迁移来清理和重建颤动数据库就可以解决这个问题。然而,我也做了同样的事情,但没有效果。
当前错误:
[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: SqliteException(1): no such table: main.checkLists, SQL logic error (code 1)
当我将新的 task 插入 tasks
时会发生这种情况我的数据库当前有两个表。
后来添加了任务,我创建了一个MigrationStrategy,如下所示:
MigrationStrategy get migration => MigrationStrategy(
onCreate: (m) async {
await m.createAll(); // create all tables
final TasksCompanion task = TasksCompanion.insert(checkListId: 1, toDo:'First');
await into(tasks).insert(task); // insert on first run.
},
onUpgrade: (migrator, from, to) async {
if(from == 1){
await migrator.createTable(tasks);
}
},
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON');
},
);
首次运行插入成功。含义 任务表已创建。 我不知道还能做什么,因为没有其他编译器错误。
请注意,错误状态没有这样的表:main.checkLists但在将任务插入任务表时会发生错误
这是我使用的插入算法
在 moorDatabase.dart
// inside Task Dao
Future insertTask(Insertable<Task> task){
return into(tasks).insert(task);
}
在taskScreen.dart中
addTask(BuildContext context, String toDo, DateTime createdAt){
final database = Provider.of<AppDatabase>(context, listen: false);
final tasksDao = database.tasksDao;
final TasksCompanion task = TasksCompanion.insert(checkListId: widget.checkListId, toDo: toDo, createdAt: Value.ofNullable(createdAt));
tasksDao.insertTask(task);
}
好吧,我明白了。只需将此行添加到我的迁移策略中的 onUpgrade 方法中,因为列 checkListId 是稍后添加的。
await migrator.addColumn(tasks, tasks.checkListId);
在清理正在运行的 build_runner 之前还更改了我的架构版本
当我更改代码中的表名称时,我遇到了同样的问题。我通过从模拟器或物理手机中删除应用程序并重新运行应用程序的编译来修复它
只需删除数据库即可。我的在文档中。它通常与项目名称一起。删除它并运行项目