我有一个数据库,这是我创建它的方法:
@UseMoor(tables: [
Users
Images,
], daos: [
UserDao,
ImageDao
])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(FlutterQueryExecutor.inDatabaseFolder(path: 'my-db.sql', logStatements: true));
@override
MigrationStrategy get migration => MigrationStrategy(
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON');
},
onUpgrade: (Migrator m, int from, int to) async {
if (from == 1) {
m.createTable(keps);
}
},
);
@override
int get schemaVersion => 2;
}
正如你第一次看到的那样,我只有一张桌子Users
。后来添加Images
所以我写了这个onUpgrade
方法:
onUpgrade: (Migrator m, int from, int to) async {
if (from == 1) {
m.createTable(images);
}
},
现在我想在表格中添加一列,Users
但我不知道是否应该onUpgrade
这样写:
onUpgrade: (Migrator m, int from, int to) async {
if (from == 1) {
m.createTable(images);
}
else if (from == 2) {
await m.addColumn(users, users.keycloakName);
}
},
);
@override
int get schemaVersion => 3;
在这个选项中,我希望 Moor 像这样工作:如果手机上的应用程序正在使用一个数据库,schemaVersion == 2
那么它很简单:它只是添加列。
但是,如果手机上的 schemaVersion 为 1 并获得使用 schemaVersion == 3 的新应用版本怎么办?Moor 是否意识到这一点并首先运行
if (from == 1) {
m.createTable(images);
}
部分,完成后运行:
else if (from == 2) {
await m.addColumn(users, users.keycloakName);
}
部分,或者我必须像这样编写 onUpgrade (重复代码):
onUpgrade: (Migrator m, int from, int to) async {
if (from == 1) {
m.createTable(images);
}
else if (from == 2) {
m.createTable(images);
await m.addColumn(users, users.keycloakName);
}
},
);
@override
int get schemaVersion => 3;
有了这个问题,如果手机上的 schemaVersion 已经是 2,它会尝试再次创建 iamges 表......