如何从不同的枚举类型迁移房间数据库
How to migrate Room Database from different Enum types
我有一个包含以下字段的房间数据库 table。
itemType: Int
由于我无法控制的变化,我需要将它保存为一个字符串。
即:
itemType: String
所以我像这样添加了一个数据库迁移:(这是我实际的抽象简化版本table)
database.execSQL("CREATE TABLE IF NOT EXISTS User_Backup (id TEXT NOT NULL, name TEXT NOT NULL, itemType TEXT NOT NULL, PRIMARY KEY(id))")
database.execSQL("INSERT INTO User_Backup(id,name) SELECT id,name FROM UserTable")
database.execSQL("DROP TABLE UserTable")
database.execSQL("ALTER TABLE User_Backup RENAME TO UserTable")
这很好地改变了 table 并将类型从 int 更改为 String 并保留所有其他数据。唯一的问题是我的 itemType 字段留空。
我不能按原样复制它,因为新数据应该映射到新结构。
例如:
1-> admin
2-> super user
3-> guest
等...
如何将这部分添加到迁移中?
您可以使用 CASE 将 int val 转换为 string。它可能是冗长的代码,并且由于它是枚举,所以我假设您已经知道先前 table itemType 的所有 int 值。你可以这样编码
database.execSQL("INSERT INTO User_Backup(id,name, itemType) SELECT id,name, CASE WHEN itemType == 1 THEN 'admin' WHEN itemType == 2 THEN 'super user' WHEN itemType == 3 THEN 'guest' .. ELSE 'else case value' END as itemType FROM UserTable")
我有一个包含以下字段的房间数据库 table。
itemType: Int
由于我无法控制的变化,我需要将它保存为一个字符串。 即:
itemType: String
所以我像这样添加了一个数据库迁移:(这是我实际的抽象简化版本table)
database.execSQL("CREATE TABLE IF NOT EXISTS User_Backup (id TEXT NOT NULL, name TEXT NOT NULL, itemType TEXT NOT NULL, PRIMARY KEY(id))")
database.execSQL("INSERT INTO User_Backup(id,name) SELECT id,name FROM UserTable")
database.execSQL("DROP TABLE UserTable")
database.execSQL("ALTER TABLE User_Backup RENAME TO UserTable")
这很好地改变了 table 并将类型从 int 更改为 String 并保留所有其他数据。唯一的问题是我的 itemType 字段留空。
我不能按原样复制它,因为新数据应该映射到新结构。
例如:
1-> admin
2-> super user
3-> guest
等...
如何将这部分添加到迁移中?
您可以使用 CASE 将 int val 转换为 string。它可能是冗长的代码,并且由于它是枚举,所以我假设您已经知道先前 table itemType 的所有 int 值。你可以这样编码
database.execSQL("INSERT INTO User_Backup(id,name, itemType) SELECT id,name, CASE WHEN itemType == 1 THEN 'admin' WHEN itemType == 2 THEN 'super user' WHEN itemType == 3 THEN 'guest' .. ELSE 'else case value' END as itemType FROM UserTable")