在等待破坏性迁移的同时,让我们遵循当前的迁移文档。
The official https://cashapp.github.io/sqldelight/multiplatform_sqlite/migrations/文档写得很好。
.sq 文件始终描述如何在
空数据库。如果您的数据库当前处于早期版本,
迁移文件使这些数据库保持最新状态
这意味着如果你改变了原来的.sq
文件(数据库版本1),那么如果你想migrate对于新版本(版本 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 任务验证迁移verifySqlDelightMigration
。如果您编写了错误的迁移,此任务会给您带来错误。良好的迁移反而会成功。