当前位置: 首页 > 面试题库 >

Android Room:如何迁移列重命名?

郝杰
2023-03-14
问题内容

我的应用崩溃了,因为我没有正确处理迁移。 我正在寻找一种解决方案来迁移表中1列的名称。

在我的项目中,我有一个名为“ content ”的房间表,其 双人间 属性为“ archivedCount
”。在该应用程序的最新版本中,仍将属性 archivedCount 属性重命名为 dismissCount ,仍为 Double 类型


原始内容模型

@Entity(tableName = "content")
data class Content(@PrimaryKey var id: String, var archiveCount: Double) : Parcelable {...}

新内容模型

@Entity(tableName = "content")
data class Content(@PrimaryKey var id: String, var dismissCount: Double) : Parcelable {...}

尝试的解决方案

阅读了Google Developer
Advocate的解释《用Room进行迁移》后,我尝试了在文章的“ 使用复杂的模式进行迁移
”一节中概述的解决方案,该方法需要复制原始表,删除旧表,然后重命名新创建的表。

使用下面的以下方法,在此行上会出现运行时错误:database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id, archiveCount FROM users");因为我已经清除了应用程序的缓存,所以旧表不再存在。

是否可以在不重新创建整个表的情况下更新单个列?

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
    // Create the new table
    database.execSQL(
            "CREATE TABLE content_new (id TEXT, dismissCount REAL, PRIMARY KEY(id))");
    // Copy the data
    database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id, archiveCount FROM users");
    // Remove the old table
    database.execSQL("DROP TABLE content");
    // Change the table name to the correct one
    database.execSQL("ALTER TABLE content_new RENAME TO content");
  }
};

问题答案:

解决方案

感谢@TimBiegeleisen的指导,我们发现针对 API 27*28 的SQLite

3.19
的Android实现尚未升级到版本 3.25
SQLite,该功能允许在此StackOverflow帖子中概述。

*

Android升级后,将可以使用诸如此类的命令来更改表格列: database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")



 类似资料:
  • 我有大约30个迁移文件。 当它到达包含重命名列的迁移时: 它只会在迁移时出错(比如说,第15个)。它可以正常运行所有其他迁移。如果我对此进行评论,那么它将按预期完成。 我运行或 我得到以下错误: PHP-v给了我这个: MySQL-v给了我这个: 我使用的是“条令/dbal”:“~2.3” 此错误仅在本地计算机上运行迁移时发生。在我的docker-compose堆栈和Vagant框中按预期完成。所

  • 问题内容: (我知道有一个与此标题相同的标题,但问题有所不同)。 我设法使开发机器迁移和生产迁移不同步。 我有一个使用South的Django应用。我有自己的工作流程,效果很好(这可能不是正确的处理方式,但我没有任何问题)。 基本上,我有一个脚本,可将生产数据库转储复制到我的开发计算机上。它还复制了迁移文件。这样,两者就同步了,我可以像往常一样运行South命令。 现在,我已升级到1.7,并开始使

  • 我们正在尝试将迁移作为.sql文件置于版本控制之下。开发人员将编写一个vn__*.sql文件,提交到版本控制,并且每5分钟运行一次的作业将自动迁移到开发和测试数据库。一旦更改被证明没有引起问题,其他人就会运行一个手动作业来在生产上运行迁移。 我的问题: 我有一个演示迁移,创建了几个表。我将v4__demotable.sql检查到PC上的版本控制中。 阅读文档时,开发人员似乎建议我应该创建一个新的v

  • 在我的一个DynamoDb表中,我有一个名为“status”的列/键,它原来是一个保留关键字。不幸的是,不能删除整个表并重新初始化它。如何重命名密钥? 以下是导致异常的Lambda代码: 这里有一个例外: 2016-06-14 18:47:24UTC 2 ok错误:在调用UpdateItem操作时发生错误(ValidationExc0019):无效的Update表达式:属性名称是保留关键字;保留关

  • 我们中的两个人在不同的GIT分支中制作了一个迁移脚本。现在,我已经拉动了源开发分支,并更正了 GIT 合并问题,并将我的迁移脚本重命名为最后一个。因此,数据库的新初始化和从开发分支的版本迁移数据库将是可以的。 然而,我的本地测试数据库中有很多数据,所以我手动应用了我在GIT中引入的新迁移脚本。然而,我不能让flyway认为,一切都很好。 那么,我如何才能伪造迁移? 当我尝试迁移时,我收到以下错误:

  • 添加了一些与CLANG相关的新属性: 如何配置项目以使用Xcode12.5部署此应用程序? $React-本机信息获取系统和库信息...System:OS:macOS 11.3 CPU:(4)x64 Intel(R)Core(TM)i3-8100B CPU@3.60 GHz内存:256.45MB/8.00 GB shell:3.2.57-/bin/bash二进制文件:node:10.16.0-/u