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

2024-01-01

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

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

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

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

我不想删除并重新安装该应用程序。理想的解决方案是这样的后退到破坏性迁移 https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Builder#fallbackToDestructiveMigration()房间数据库有

I found 这次讨论 https://github.com/cashapp/sqldelight/issues/1213关于破坏性的移民。最后的评论建议在特定于平台的驱动程序中处理这个问题,但它没有显示如何做到这一点。

所以我的问题是:

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

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


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

The official https://cashapp.github.io/sqldelight/multiplatform_sqlite/migrations/文档写得很好。

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

这意味着如果你改变了原来的.sq文件(数据库版本1),那么如果你想migrate对于新版本(版本 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 任务验证迁移verifySqlDelightMigration 。如果您编写了错误的迁移,此任务会给您带来错误。良好的迁移反而会成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • CBPeripheral 名称有时为 null

    我正在开发一个应用程序来与蓝牙 LE 外围设备进行通信 我目前正在测试的外围设备是其中之一these http www ti com tool cc2540dk mini 有趣的是 有时当我发现它时 我会得到它的正确名称 SimpleBLE
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • ViewWillAppear 没有被 UISplitViewController 调用

    背景和目标 我有一个基于 UISplitViewController 的 iPad 应用程序 到目前为止它支持 4 个方向 但现在我想将其锁定为仅横向 我变了shouldAutorotateToInterfaceOrientation左视图
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • 尝试复制文件时出错

    我正在尝试使用 NSFileManager 将临时文件复制到另一个位置 但是它失败并抱怨其中一个文件不存在 Copy temp file NSError error BOOL exists fileManager fileExistsAtP
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 将带有地理位置数据的照片保存到照片库 Swift 3

    如何使用地理位置元数据将照片保存到照片库 我已请求 并允许 应用程序访问用户位置 private func allowAccessToUserLocation locationManager CLLocationManager locati
  • 通过 ADB 拔出设备:“找不到服务”

    我必须测试我的应用程序在打瞌睡模式下的行为 根据文档 https developer android com training monitoring device state doze standby html testing doze 我
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • Android:有没有办法以毫安为单位获取设备的电池容量?

    我想获取设备的电池容量来进行一些电池消耗计算 是否可以以某种方式获取它 例如 三星 Galaxy Note 2 的电池容量为 3100mAh 谢谢你的帮助 知道了 在 SDK 中无法直接找到任何内容 但可以使用反射来完成 这是工作代码 pu
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • ASP.Net,母版页:每页样式表

    这些是我的假设 这些正确吗 使用 CSS 进行布局优于 使用表格 CSS 应提取到单独的文件中 而不是内联 CSS 是从 site master 中导入 链接 的 因此所有 css 都会导入 并应用于 所有 aspx 页面 鉴于此 我有一个
  • 在 data.frame 的列中填充字符串

    我有一个data frame X 有一个列A洋溢着chr 其中大部分属于nchar 5 但有些是nchar 4 我想放一个0在那些人面前 我会用以下伪代码来做到这一点 foreach element of X A as a this lin
  • jsPDF html 方法使用 addPage 在生成的 PDF 中分割页面

    我在用jsPDF s html为某些由多个段落组成的 html 生成 PDF 的方法p与每个p包含 50 500 个单词 PDF 是使用我定义的样式正确生成的 我面临的唯一问题是当内容p标签溢出到 PDF 中的新页面 剪切部分文本 如下所示
  • 如何使用sendinput函数C++

    尽管我从msdn看到了sendinput函数 但我不知道输入了什么参数 UINT WINAPI SendInput In UINT nInputs In LPINPUT pInputs In int cbSize 上面的参数是什么意思以及我
  • 使用 T-SQL 生成随机字符串

    如果您想使用 T SQL 生成伪随机字母数字字符串 您会怎么做 如何从其中排除美元符号 破折号和斜杠等字符 使用指南 SELECT randomString CONVERT varchar 255 NEWID 很短
  • 在 RSpec 测试中“let”真正节省了多少时间?

    我发现在代码中设置变量比使用变量容易得多let let很挑剔 总是告诉我错误使用的方式 当我在规范中使用简单的变量声明时 例如 tx good makeTransaction1 一切正常 但是当我使用let像这样 let tx good m
  • Django,级联移动到单独的表而不是级联删除

    我想在我们使用时保留数据delete 代替soft delete 使用 is deleted 字段 我想将数据移动到另一个表 对于已删除的行 https stackoverflow com a 26125927 433570 https s
  • 结果文档中生成空/空白命名空间声明

    我编写了一个用于将 XML 转换为 ePub 的包 一切正常 除了某些情况下 空白命名空间 xmlns 节点被写入结果文档 在转换之前 我准备了临时变量来保存主要段 即 meta body等 最后复制节点 使用xsl copy of cop
  • 为什么我们需要杰克逊数据绑定?

    我是 Spring MVC 的新手 我的问题是 为什么我们需要 jackson databind 因为我们可以收到Request Params by ModelAttribute并通过 http PUT 或 POST 请求 RequestB
  • 在 React 中更新 d3 元素?

    我正在尝试根据输入栏中的搜索输入更新此气泡图 现在 我将所有 d3 代码放入 Bubble js 中 然后在 app js 中 我有一个 searchinput 元素 它将过滤要显示的数据 然后在 Bubble 的状态中 我将其数据设置为等
  • UIPageViewController委托方法类似于scrollViewDidScroll:(UIScrollview*)scrollview

    我正在使用 UIPageViewController 来滑动一系列视图控制器 我希望父视图控制器的背景在滑动时根据视图之间滚动的位置在颜色之间平滑过渡 我希望 UIPageViewController 会有一个类似于带有位置的 scroll
  • 看起来像链接的按钮

    您好 我有一个要求 不允许我在页面上使用 javascript 我有一些asp LinkButtons但这些似乎使用了 javascript 所以我用按钮替换了它们
  • PHP 连接:关闭

    我有一个 PHP 应用程序 但遇到了一些问题 某些页面需要很长时间才能加载 几个小时后我发现了问题 但我不知道如何解决它 问题似乎出在标题上Connection keep alive 我使用了一个名为 Tamper Data 的 Firef
  • 如何在android中闪烁通知图标? [完毕]

    我搜索了很多东西 例如 如何在谷歌地图上显示闪烁的图标 https stackoverflow com questions 6729255 how to show icon blinking on google map 但根据这个我不知道如
  • Prolog 中 \+ 是什么意思?

    我在这里看到了一些使用它的答案 但我不知道它是什么意思或如何使用它 我也很难通过搜索引擎找到它 这是 无法证明 http en wikipedia org wiki Prolog Negation 操作员 如果其论证不可证明 则它成功 如果
  • 即使关闭 SSH 终端后,如何保持 Websocket 服务器运行?

    因此 我将 Ratchet 与 PHP 结合使用 并且目前已将一个成功的 websocket 示例上传到我的服务器 它在我进入 SSH 后起作用 然后只需手动运行 php bin chat server php 我想知道的是 在商业情况下
  • 更改 VSCode 用户设置位置

    我想将我的用户设置文件置于版本控制之下 最好是一个单独的文件夹 但我找不到告诉 VSCode 我的设置文件所在位置的选项 有没有办法更改 Visual Studio Code 查找的位置settings json file Update 由
  • 在多台 Mac 上开发 iPhone 应用程序

    这可能非常愚蠢 但我可以使用多台具有不同开发配置文件的 Mac 来制作应用程序吗 如果我带着我朋友的 Macbook 去旅行 而他也是一名开发人员并拥有自己的开发配置文件 我可以使用我自己的开发人员配置文件来处理我的应用程序而不干扰他的应用
  • 在 JavaScript 中初始化对象的空属性的正确方法是什么

    我有一个具有属性的对象 其中 1 个属性prop2只会在稍后初始化并在准备好时添加到该对象 我想将其显示为对象的属性 纯粹是为了人类可读性 这样当我稍后查看代码时 我就会知道它存在并且将 可以使用 所以我的问题是什么 是什么正确的方法初始化
  • 如何查看/更新数据库版本?有类似“fallbackToDestructiveMigration”之类的东西吗?

    修改后sq通过重命名其中一个表并添加另一个表来更改我的文件 我没有找到任何地方来指定数据库架构或版本已更改 并且我不想迁移 只需重新创建数据库 有关的文档官方网站 https cashapp github io sqldelight mul