如何see/update数据库版本?有没有类似 "fallbackToDestructiveMigration" 的东西?

How to see/update database version? Is there something like "fallbackToDestructiveMigration"?

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

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

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

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

我不想删除并重新安装该应用程序。理想的解决方案是 fallbackToDestructiveMigration Room database has

我发现 this discussion 有关破坏性迁移的信息。最后一条评论建议在特定于平台的驱动程序中处理该问题,但并未说明如何处理。

所以我的问题是:

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

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

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

official 文档写得很好。

The .sq file always describes how to create the latest schema in an empty database. If your database is currently on an earlier version, migration files bring those databases up-to-date

这意味着如果您更改原始 .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。

现在假设您要添加一个 table 并更改之前的一个,您必须相应地更改 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。或者你可以

generate a .db file from your latest schema, run the generateSqlDelightSchema task, which is available once you specify a schemaOutputDirectory, as described in the gradle.md. You should probably do this before you create your first migration.

这样做,您可以使用 gradle 任务 verifySqlDelightMigration 验证迁移。如果您编写了错误的迁移,此任务会给您带来错误。反而会顺利迁移成功。