android - 如何查看/更新数据库版本?有类似 "fallbackToDestructiveMigration"的东西吗?

标签 android ios kotlin-multiplatform sqldelight

修改后平方 通过重命名其中一个表并添加一个表来创建文件我没有找到任何地方可以指定数据库架构或版本已更改,并且我不想迁移 - 只需重新创建数据库。 official website 上的文档不包含有关此的任何信息。
项目可以编译,但是当我在 Android 和 iOS 上运行该应用程序时,我遇到了运行时崩溃,并且在日志中它说添加的表不存在。
我尝试在共享模块的 build.gradle.kts 中添加版本,但我仍然遇到运行时崩溃:

sqldelight {
   database("MyDatabase") {
      packageName = "com.example.shared.cache"
      version = 2 // added this line only
   }
}
我不想删除并重新安装该应用程序。理想的解决方案类似于 fallbackToDestructiveMigration房间数据库有
我找到了this discussion关于破坏性迁移。最后的评论建议在特定于平台的驱动程序中处理它,但它没有显示如何做到这一点。
所以我的问题是:
  • 如何更改数据库版本?
  • 如何设置破坏性迁移?

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

    最佳答案

    在等待破坏性迁移的同时,让我们关注当前的迁移文档。
    official docs它写得很好。

    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。
    现在假设您要添加一个表并更改以前的表,您必须更改您的 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 验证迁移。 .如果您编写了错误的迁移,此任务会给您错误。相反,它将成功进行良好的迁移。

    关于android - 如何查看/更新数据库版本?有类似 "fallbackToDestructiveMigration"的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65200099/

    相关文章:

    android - 由 : java. lang.ClassNotFoundException 引起:在路径 DexPathList 上找不到类 "com.crashlytics.android.beta.Beta"

    适用于 Netbeans 6.8 的 Android 布局管理器

    ios - 不使用 Facebook 和 Twitter 帐户的 Gigya native 登录

    Kotlin 与 Objective-C 框架的多平台/原生互操作性

    gradle - Kotlin-Multiplatform - 在 Bintray 上上传-发布后,没有在 Gradle 依赖项上下载 Jar 文件

    android - 如何实现类似Google Play的截图库?

    android - 我的属性始终是MVVM模型中的默认值

    ios - 自定义 UITableView 单元格导致错误

    ios - 为什么当我在平移单元格时更改 UIImageView 的图像时整个 View 会重置一秒钟?

    android - 由于Android目标,Kotlin Multiplatform构建失败