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

时间:2018-10-05 02:55:29

标签: android sql android-sqlite android-room

问题

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

在我的项目中,我有一个名为“ content ”的房间表,该房间表具有 Double 属性“ 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的说明Understanding migrations with 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");
  }
};

2 个答案:

答案 0 :(得分:3)

解决方案

由于@TimBiegeleisen的指导,我们发现 API 27 28 Android implementation of SQLite 3.19 到版本 3.25 的SQLite,该版本允许此StackOverflow post中概述的功能。

一旦Android升级了诸如此类的命令以更改表列,便可以:// Setup Luis Recognizer first: const LuisModelUrl = 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/' + LuisID + '?subscription-key=' + LuisKey; var recognizer = new Builder.LuisRecognizer(LuisModelUrl); bot.recognizer(recognizer); // Dialog definition bot.dialog('login', [ (session:Builder.Session) => { // Your dialog stuff here } ]).cancelAction( "Cancel", "What would you like to do next?", { matches: "Cancel", confirmPrompt: "This will cancel your dialog. Are you ure?" } );

答案 1 :(得分:1)

有一个无需迁移的解决方案-使用ColumnInfo

data class Content(@PrimaryKey var id: String,  @ColumnInfo(name = "archiveCount") var dismissCount: Double) : Parcelable{...}

数据库列仍将为archiveCount,但在Kotlin中,属性将被重命名。