如何查看/更新数据库版本?有类似“fallbackToDestructiveMigration”之类的东西吗?

Mar*_*rat 8 android ios sqldelight kotlin-multiplatform

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

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

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

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

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

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

所以我的问题是:

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

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

sha*_*eep 6

在等待破坏性迁移时,让\xe2\x80\x99s 遵循当前的迁移文档。

\n

官方文档写得很好。

\n
\n

.sq 文件始终描述如何在空数据库中创建最新架构。\n 如果您的数据库当前处于早期版本,\n迁移文件将使这些数据库保持最新状态

\n
\n

这意味着,如果您更改原始.sq文件(数据库版本 1),那么如果您想要将设备中已创建的数据库迁移1.sqm到新版本(版本 2),您必须编写一个文件,在其中添加版本 1 之间的所有差异和版本2。

\n

假设您的原始(第一个应用程序版本)数据库是由

\n

MyDb.sq :

\n
-- src/main/sqldelight/com/example/sqldelight/MyDb.sq\n\nCREATE TABLE Foo (\n  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n  foo TEXT NOT NULL\n);\n\nINSERT INTO Foo (foo)\nVALUES (\'bar\');\n
Run Code Online (Sandbox Code Playgroud)\n

据说这是您的数据库的版本 1。

\n

现在,假设您要添加一个表并更改前一个表,您必须MyDb.sq为在新应用程序全新安装中创建的新数据库相应地更改文件,但您还需要添加一个1.sqm(数字1是db 版本升级到后续版本 \xe2\x80\x94 在这种情况下 2) 迁移当前应用程序安装中的现有原始数据库。

\n

MyDb.sq :

\n
-- src/main/sqldelight/com/example/sqldelight/MyDb.sq\n\nCREATE TABLE Foo (\n  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n  foo TEXT NOT NULL,\n  bar TEXT\n);\n\nINSERT INTO foo (foo, bar)\nVALUES (\'bar\', \'beer\');\n\nCREATE TABLE Beer (\n  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n  brew TEXT NOT NULL\n);\n
Run Code Online (Sandbox Code Playgroud)\n

1.sqm :

\n
-- src/main/sqldelight/com/example/sqldelight/2.sqm\n\nALTER TABLE foo ADD COLUMN bar TEXT;\n\nCREATE TABLE Beer (\n  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n  brew TEXT NOT NULL\n);\n
Run Code Online (Sandbox Code Playgroud)\n

如果您从一台设备提取原始数据库,您可以将其与这两个文件放在一起并命名为1.db. 或者你可以

\n
\n

要从最新架构生成 .db 文件,请运行generateSqlDelightSchema 任务,该任务在您指定\nschemaOutputDirectory 后可用,如 gradle.md 中所述。您应该\n在创建第一次迁移之前执行此操作。

\n
\n

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

\n