在等待破坏性迁移的同时,让我们关注当前的迁移文档。
官方文档写的很好。
.sq 文件始终描述如何在空数据库中创建最新架构。如果您的数据库当前处于早期版本,迁移文件会使这些数据库保持最新
这意味着如果您更改原始.sq
文件(数据库版本 1),那么如果要将设备中已创建的数据库迁移到新版本(版本 2),您必须编写一个1.sqm
文件,在其中添加版本 1 之间的所有差异和版本 2。
假设您的原始(第一个应用程序版本)数据库是由
MyDb.sq
:
-- src/main/sqldelight/com/example/sqldelight/MyDb.sq
CREATE TABLE Foo (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
foo TEXT NOT NULL
);
INSERT INTO Foo (foo)
VALUES ('bar');
据说这是您的数据库的版本 1。
现在假设您要添加一个表并更改前一个表,您必须为MyDb.sq
在新应用程序全新安装中创建的新数据库相应地更改文件,但您还需要添加一个1.sqm
(数字1是数据库版本升级到后续版本——在本例中为 2) 以迁移当前应用安装中的现有原始数据库。
MyDb.sq
:
-- src/main/sqldelight/com/example/sqldelight/MyDb.sq
CREATE TABLE Foo (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
foo TEXT NOT NULL,
bar TEXT
);
INSERT INTO foo (foo, bar)
VALUES ('bar', 'beer');
CREATE TABLE Beer (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
brew TEXT NOT NULL
);
1.sqm
:
-- src/main/sqldelight/com/example/sqldelight/2.sqm
ALTER TABLE foo ADD COLUMN bar TEXT;
CREATE TABLE Beer (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
brew TEXT NOT NULL
);
如果您从一台设备中提取原始数据库,您可以将其与这两个文件放在一起并命名它1.db
。或者你可以
从您的最新架构生成 .db 文件,运行 generateSqlDelightSchema 任务,一旦您指定 schemaOutputDirectory,该任务就可用,如 gradle.md 中所述。您可能应该在创建第一个迁移之前执行此操作。
这样做您可以使用 gradle task 验证迁移verifySqlDelightMigration
。如果您编写了错误的迁移,此任务会给您错误。相反,它将成功进行良好的迁移。