我的应用崩溃了,因为我没有正确处理迁移。 我正在寻找一种解决方案来迁移表中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 DeveloperAdvocate的解释《用Room进行迁移》后,我尝试了在文章的“ 使用复杂的模式进行迁移 ”一节中概述的解决方案,该方法需要复制原始表,删除旧表,然后重命名新创建的表。
使用下面的以下方法,在此行上会出现运行时错误:database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id,archiveCountFROMusers");因为我已经清除了应用程序的缓存,所以旧表不再存在。
database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id,archiveCountFROMusers");
是否可以在不重新创建整个表的情况下更新单个列?
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.25SQLite,该功能允许在此概述。
Android升级后,将可以使用诸如此类的命令来更改表格列: database.execSQL("ALTER TABLE content RENAMECOLUMN archiveCount TO dismissCount")
database.execSQL("ALTER TABLE content RENAMECOLUMN archiveCount TO dismissCount")