Room 的“onDelete = CASCADE”在迁移期间不起作用

2024-01-12

我有以下表格:

@Entity(
    tableName = "users"
)
class Users {
    @PrimaryKey(autoGenerate = true)
    var id: Long? = null

    @NonNull
    var name: String? = null
}

@Entity(
    tableName = "pets",
    foreignKeys = [
        ForeignKey(
            entity = Users::class,
            parentColumns = ["id"],
            childColumns = ["owner_id"],
            onDelete = ForeignKey.CASCADE
        )
    ]
)
class Pets {
    @PrimaryKey(autoGenerate = true)
    var id: Long? = null

    @NonNull
    var name: String? = null

    @ColumnInfo(name = "owner_id")
    var ownerId: Long? = null
}

当我运行删除所有用户表行的迁移时,pets 表不受影响。这些行不会自动删除。

object Migration_1_2 : Migration(1, 2) {

    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("""
            DELETE FROM users
        """)
    }
}

即使我在迁移之前执行以下代码片段,它也不起作用。

database.execSQL("PRAGMA foreign_keys=ON;");

我应该做什么才能使onDelete = ForeignKey.CASCADE work?


正如@sergiytikhonov 在他的评论中指出的那样,在迁移函数中启用foreign_keys 约束没有任何效果。这是因为迁移作为事务的一部分执行 https://developer.android.com/reference/androidx/room/migration/Migration#migrate(androidx.sqlite.db.SupportSQLiteDatabase) and pragma 是事务内的无操作 https://www.sqlite.org/pragma.html#:~:text=PRAGMA%20foreign_keys%20%3D%20boolean%3B,no%20pending%20BEGIN%20or%20SAVEPOINT..

我没有看到任何方法来获得控制和启用foreign_keys在执行迁移之前。我认为您唯一的选择是在迁移过程中明确删除宠物:

override fun migrate(database: SupportSQLiteDatabase) {
    database.execSQL("""
        DELETE FROM pets WHERE owner_id IN (SELECT id FROM users)
    """)

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

Room 的“onDelete = CASCADE”在迁移期间不起作用 的相关文章

  • Android Invalidate() 仅限单个视图

    我有 2 条意见RelativeLayout 我需要调用 调用 onDraw 仅单个视图 当我尝试时view1 invalidate 它还调用 call onDraw view2绘制 该怎么办 thanks if view1与重叠view2
  • DESFire EV1 卡模拟

    我需要在 Android 设备上模拟 DESFire EV1 卡 但是 我对如何将 Mifare SDK 精简版或高级版 与 HCE 结合使用感到困惑 这可能吗 我需要启动该项目 并且对如何在 DESFire 卡中存储和加密数据进行了大量研
  • 在android Eclipse juno中生成R.java的过程是什么

    我已经安装了 eclipse juno 并添加了 android sdk 的插件 安装android SDK管理器后 我创建了一个新的android项目 但是出现了问题R java file R java打不开 请给我一个解决方案 我是安卓
  • 使用全屏对话框时如何隐藏导航栏

    我用的是全屏 Dialog以显示ExoPlayer全屏模式下的视频 我已经在使用以下代码onCreate的方法Activity主办Dialog隐藏Navigation Bar public class BaseActivity extend
  • 在多台计算机上使用相同的调试密钥库

    我正在多台计算机上进行开发 如果我直接从一台计算机上的 Eclipse 部署到手机 则在不先卸载的情况下无法从另一台计算机进行部署 我假设这是因为有一个调试证书用于签署应用程序 并且它们在两台机器上并不相同 是否可以将一台机器复制到另一台机
  • Firestore:发现名称 isText 的 getter 冲突

    我试图查看类似的问题 但它们对我来说没有用 我有一堂课 data class TextMessage val text String override val time Date override val senderId String o
  • 一段时间后完成活动

    我正在尝试开发一个类似匹配小图片的游戏 我的问题是我想在一段时间后完成游戏 例如 在第 1 级中 我们有 10 秒的时间来匹配图片 我也想显示剩余时间 如果有任何帮助 我将不胜感激 既然你还想显示倒计时 我会推荐一个倒计时器 http de
  • Android Studio 2.3 Beta 1 + 支持 25.1.0 = 预览已损坏

    Android Studio 2 3 Canary 3 支持库25 1 0 布局预览完全损坏 任何包含支持相关视图的内容似乎都会在预览期间中断 在所有情况下 这都是堆栈的开头 Exception Details java lang NoSu
  • Fragment 内的 Android Tab 布局

    我有一个带有导航抽屉的主要活动 我正在尝试实现像带有选项卡的播放音乐应用程序这样的布局 MainActivity 有一个类似容器的 FrameLayout
  • 如何向通话记录数据库添加新字段和记录?

    我正在尝试制作 VoIP 应用程序 我想知道是否可以通过呼叫日志内容提供商执行以下操作 我想为 VoIP 呼叫添加新的呼叫日志记录以及常规呼叫的呼叫日志 如何向现有通话记录内容提供商添加新记录 我想将自定义字段添加到呼叫日志中 例如会话 I
  • Android Multipart HTTP Post 不发送文件的 MIME 类型

    试图找出我的编码有什么问题 我关注了一篇博客文章here http evgenyg wordpress com 2010 05 01 uploading files multipart post apache 我设法获得了将文件实际上传到
  • 有问题的 ListView 让我很难过

    我有一个ListView我在单独的 XML 文件中定义了每个项目的布局 在这个文件中我包含了一个RatingBar and an EditText 我已经以编程方式在其中创建了 7 8 个项目ListView 当我滚动浏览它们时 它似乎有很
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • 将文本从一个 EditText 框逐个字符地即时复制到同一 Activity 中的另一个框

    我正在构建一个应用程序来转换纬度和经度 各种格式之间 我的布局已完成 但我当前的布局 挑战是这样的 对于 Degree 值 当用户在 EditText1 中输入值时 我想要 当他们打字时 它会在 EditText2 中实时复制字符 为了性格
  • Android 中的 SeekBar 和媒体播放器

    我有一个简单的播放器和录音机 一切都很好 但有一个问题 我想添加搜索栏来查看播放记录的进度 并使用此搜索栏来设置播放器应该播放的位置 我有 onProgress 但没有效果 这是代码 package com example recorder
  • java.lang.SecurityException:权限拒绝:来自 pid=1484、uid=10151 的 getIntentSender()(需要 uid=1000)

    我专门收到此错误HTC 欲望 626GPLUS 双卡双待与安卓4 4 2 java lang SecurityException Permission Denial getIntentSender from pid 1484 uid 101
  • 如何在 Android Lollipop 中使用注释修复 Android Jackson 解析期间的 IncompleteClassChangeError?

    在我们的 Android 应用程序中 我们在模型中使用 Jackson Annotations JsonTypeInfo use JsonTypeInfo Id NAME include JsonTypeInfo As PROPERTY p
  • 如何压缩和解压文件?

    如何压缩和解压 DDMS 中已有的文件 data data mypackage files 我需要一个简单的例子 我已经搜索过与 zip 和 unzip 相关的内容 但是 没有一个例子可供我参考 谁能举个例子 提前谢谢 查看 zip 功能的
  • 创建带有圆角的 ImageView [重复]

    这个问题在这里已经有答案了 我将如何创建一个ImageView有边框和圆角吗 我想要的角落ImageView为了是圆形的 我尝试创建一个可绘制的形状 其中包含笔划和圆角作为可绘制的背景ImageView但这并没有给出正确的效果 因为图像被填
  • android中自动启动一个新的activity

    我正在创建一个 Android 应用程序 我有一个logo screen Activity 然后我的home screen another activity 我希望当我启动应用程序时 我的徽标屏幕应该出现 然后 2 秒后自动出现我的主屏幕

随机推荐

  • React-dnd getDecolatedComponentInstance() 不是一个函数

    我目前正在 React 中构建文件上传和排序功能 我使用了以下示例 https gaearon github io react dnd examples chessboard tutorial app html https gaearon
  • 根据距离聚合 sf 点

    当点在指定距离内时 我想创建 SpatialPointsDataFrame 的所有变量的平均值 我有一个方法可以做到这一点 但这似乎是解决问题的愚蠢方法 任何使用整洁的现代语法来做到这一点的想法将不胜感激 首先 我有一个SpatialPoi
  • 如何将此 MySQL SELECT 查询转换为 DELETE 查询?

    我想从数据库中删除某些项目 我有以下查询 SELECT FROM sheets entries WHERE entries sheetID sheets id AND sheets clientID 13 这有效 并返回 2 个结果 现在我
  • 如何锁定尚不存在的 InnoDB 行?

    如何保证我可以搜索数据库中是否存在用户名 然后将该用户名作为新行插入数据库中 而在用户名之间没有任何拦截SELECT and INSERT声明 几乎就好像我锁定了不存在的行 我想用用户名锁定不存在的行 Foo 这样我现在就可以检查它是否存在
  • 结对编程、混合 IDE 环境?

    有人有过在混合 IDE 环境中进行结对编程的团队经验吗 我是 IntelliJ 的长期用户 其他人使用 Eclipse 您可能听说过 在我看来 结对编程涉及程序员之间大量传递键盘 但每次我拿到键盘时 我都会停下来 因为我不知道还能做什么 就
  • 使用 HTTP PUT 通过 Jquery 和 Rails 3 发送 JSON

    HTTP PUT 并不完全跨浏览器 因此 Rails 我使用的是 Rails 3 支持使用 POST 并传递 method查询参数这很棒 但是在发送 JSON 时似乎不起作用 Example ajax url window location
  • 如何在 Bokeh (Python) 中绘制水平条形图

    我有这个数据 data Cities Des Moines 80 0 Lubbock 300 0 Minneapolis 85 7 Orange County 80 0 Salt Lake City 81 8 San Diego 80 0
  • Visual Studio 设计器不显示嵌入字体

    我在 Visual Studio 2013 的 C WPF NET 4 0 应用程序 特别是 Open Sans 和 FontAwesome 中使用一些自定义字体 I have 将 FontAwesome otf 和 OpenSans Re
  • 杰克逊 2.0 与球衣 1.12

    有人设法将 Jackson 2 0 与 Jersey 1 12 一起使用吗 知道这一点将会非常有趣 我们必须在所有地方使用 Jackson 1 9 x 只是因为 jersey 与 Jackson 的耦合如此紧密 据我所知 甚至 jersey
  • 我的 App Engine 控制面板中的数据存储区管理页面为空白

    我在 appspot com 上的所有应用程序中的数据存储管理页面都是空白的 我已按照说明启用它们 并且没有收到任何错误消息 只是加载了空白页面 有人可以帮忙吗 如果您使用的是 Google Chrome 并通过多个 Gmail 帐户登录
  • 模拟本地网络的低速连接

    有时我想手动测试我的 Web 应用程序 调用 Web 服务或网站或 RIA 的桌面应用程序 以查看它们在低速互联网连接 例如 56 kbps 下的行为方式 是否可以通过网络模拟比真实速度更低的速度来实现 如果是 是否也可以模拟低质量连接 例
  • 使用苹果的 auriotouch 示例计算频率

    我正在开发一个需要捕获吉他声音频率的程序 我修改了 aurioTouch 示例 以使用幅度最高的频率来输出频率 它适用于高音 但在低音弦上非常不准确 我相信这是由于泛音造成的 我研究了如何解决这个问题的方法 例如倒谱分析 但我不知道如何在示
  • 是否可以在同一个 Django 项目中拥有单独的 SQLite 数据库?

    我正在考虑为 Django 项目上的某些应用程序创建一个单独的 SQLite 数据库 但是 如果可能的话 我不想使用直接 SQLite 访问 对这些数据库的 Django 风格 ORM 访问将是理想的选择 这可能吗 谢谢 是的 低级 API
  • 从 swift 调用 Objective-C typedef 块

    我正在尝试从 swift 调用一个方法 该方法是用 Objective C 编写的单例 头文件中的块 typedef void VPersonResultBlock Person person NSError error void askF
  • 为什么 Swift 中的协议比类更好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过观看Apple提供的视频教程 似乎swift是面向协议的编程语言 并且Apple鼓励程序员使用协议而不是类 但从我个人的角度来看 我认为协议
  • Magento 购物车 API 不显示价格

    我正在尝试使用 Magento Enterprise 1 10 XML RPC API 来处理 Magento 安装之外的购物车 目录功能 我遇到的问题是当我添加到购物车时 我可以很好地连接到 API 端点 登录并检索数据 以下是我用来发现
  • 更新 Google App Engine 中的模型架构?

    谷歌建议一次将一个条目更改为默认值 http code google com appengine articles update schema html http code google com appengine articles upd
  • 为什么 WinForms/WPF 控件不在内部使用 Invoke?

    我明白为什么 GUI 控件具有线程关联性 But 为什么控件不在其方法和属性中内部使用调用 现在你必须做这样的事情才能更新TextBox value this Invoke new MethodInvoker delegate textBo
  • Amazon SSE-S3 密钥轮换如何工作?

    我正在尝试围绕 Amazon 的服务器端加密选项进行思考 以便在我的应用程序上传文件时开始要求 S3 加密我的静态数据 到目前为止 AWS 管理的加密密钥选项听起来像是我正在寻找的 Model C https media amazonweb
  • Room 的“onDelete = CASCADE”在迁移期间不起作用

    我有以下表格 Entity tableName users class Users PrimaryKey autoGenerate true var id Long null NonNull var name String null Ent