我的应用崩溃了,因为我没有正确处理迁移。 我正在寻找一种解决方案来迁移表中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");
}
};
答案 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中,属性将被重命名。