Как перенести базу данных Room из разных типов Enum - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть таблица базы данных Room со следующим полем.

itemType: Int

из-за не зависящих от меня изменений, мне нужно сохранить ее как строку. то есть:

itemType: String

, поэтому я добавил миграцию базы данных следующим образом: (это упрощенная абстрактная версия моей фактической таблицы)

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")

это очень хорошо меняет таблицу и изменяетвведите от int до String и сохранит все остальные данные. единственная проблема заключается в том, что мое поле itemType оставлено пустым.

, и я не могу скопировать его как есть, потому что новые данные должны быть сопоставлены с новой структурой.

например:

1-> admin
2-> super user
3-> guest

и т.д ...

как добавить эту часть в миграцию?

1 Ответ

3 голосов
/ 09 ноября 2019

Вы можете использовать CASE для преобразования int val в строку. Это может быть длинный код, и, поскольку это enum, я предполагаю, что вы уже знаете все значения int из предыдущей таблицы itemType. Вы можете закодировать это как

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")
...