テーブルに張ったインデックスの制約が変わったときなど、手動マイグレーションをするときは次のようにマイグレーションを実装する。
- 同じカラムを持つ新しい別のテーブルを用意する
- 元のテーブルから新しいテーブルにデータを移し替える
- 元のテーブルをドロップする
- 新しいテーブルの名前を元のテーブルの名前に変更する
- インデックスを貼る
class SampleIndexMigration : Migration(1, 2) { override fun migrate(db: SupportSQLiteDatabase) { db.execSQL("CREATE TABLE IF NOT EXISTS `sample_new` (`foo` TEXT NOT NULL, `bar` TEXT NOT NULL, `baz` TEXT NOT NULL, PRIMARY KEY(`foo`)) ") db.execSQL("INSERT INTO `sample_new` (`foo`, `bar`, `baz`) SELECT `foo`, `bar`, `baz` FROM `sample`") db.execSQL("DROP TABLE `sample`") db.execSQL("ALTER TABLE `sample_new` RENAME TO `sample`") db.execSQL("CREATE INDEX IF NOT EXISTS `index_sample_baz` ON `sample` (`baz`)") } }
SQL 文は Room が自動で生成する json から引っ張ってくると楽ができる(createSql
で探して対応する SQL 文をコピペしよう)。