5

通过重命名其中一个表并添加一个表来修改sq文件后,我没有找到任何地方可以指定数据库架构或版本已更改,并且我不想迁移 - 只需重新创建数据库。官方网站上的文档不包含有关此的任何信息。

项目可以编译,但是当我在 Android 和 iOS 上运行该应用程序时,我遇到了运行时崩溃,并且在日志中它说添加的表不存在。

我尝试在共享模块的 build.gradle.kts 中添加版本,但我仍然遇到运行时崩溃:

sqldelight {
   database("MyDatabase") {
      packageName = "com.example.shared.cache"
      version = 2 // added this line only
   }
}

我不想删除并重新安装该应用程序。理想的解决方案是类似于fallbackToDestructiveMigration Room 数据库

我发现这个关于破坏性迁移的讨论。最后的评论建议在特定于平台的驱动程序中处理它,但它没有显示如何做到这一点。

所以我的问题是:

  1. 如何更改数据库版本?
  2. 如何设置破坏性迁移?

我希望文档在各种主题上更详细。对于像我这样对 Sqlite 不是很有经验的开发人员来说,它可以更容易地找到正确的信息。

4

1 回答 1

1

在等待破坏性迁移的同时,让我们关注当前的迁移文档。

官方文档写的很好。

.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 。如果您编写了错误的迁移,此任务会给您错误。相反,它将成功进行良好的迁移。

于 2020-12-09T05:56:30.747 回答