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 数据库
我发现了关于破坏性迁移的讨论。最后的评论建议在特定于平台的驱动程序中处理这个问题,但它没有显示如何做到这一点。
所以我的问题是:
我希望文档对各个主题更加详细。对于像我这样在 Sqlite 方面经验不是很丰富的开发人员来说,它可以更轻松地找到正确的信息。
在等待破坏性迁移时,让\xe2\x80\x99s 遵循当前的迁移文档。
\n官方文档写得很好。
\n\n\n.sq 文件始终描述如何在空数据库中创建最新架构。\n 如果您的数据库当前处于早期版本,\n迁移文件将使这些数据库保持最新状态
\n
这意味着,如果您更改原始.sq文件(数据库版本 1),那么如果您想要将设备中已创建的数据库迁移1.sqm到新版本(版本 2),您必须编写一个文件,在其中添加版本 1 之间的所有差异和版本2。
假设您的原始(第一个应用程序版本)数据库是由
\nMyDb.sq :
-- 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\');\nRun Code Online (Sandbox Code Playgroud)\n据说这是您的数据库的版本 1。
\n现在,假设您要添加一个表并更改前一个表,您必须MyDb.sq为在新应用程序全新安装中创建的新数据库相应地更改文件,但您还需要添加一个1.sqm(数字1是db 版本升级到后续版本 \xe2\x80\x94 在这种情况下 2) 迁移当前应用程序安装中的现有原始数据库。
MyDb.sq :
-- 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);\nRun Code Online (Sandbox Code Playgroud)\n1.sqm :
-- 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);\nRun Code Online (Sandbox Code Playgroud)\n如果您从一台设备提取原始数据库,您可以将其与这两个文件放在一起并命名为1.db. 或者你可以
\n\n要从最新架构生成 .db 文件,请运行generateSqlDelightSchema 任务,该任务在您指定\nschemaOutputDirectory 后可用,如 gradle.md 中所述。您应该\n在创建第一次迁移之前执行此操作。
\n
这样做,您可以使用 gradle task 验证迁移verifySqlDelightMigration 。如果您编写了错误的迁移,此任务会给您带来错误。良好的迁移反而会成功。