KITCHEN DRINKER

主にAndroid開発メモとか

roomをmigrationする

roomのtable定義の追加が必要になり、初migrationしたのでメモ。

こちらを参考にしつつ進めました。

medium.com


1. データベースclassのversionを更新

@Database(entities = [LoginInfo::class], version = 1)

  ↓

@Database(entities = [LoginInfo::class, UserInfo::class], version = 2)


2. migration部分のSQLを追加

/**
 * Migrate from:
 * version 1 - create table for login info
 * to
 * version 2 - create table for user info
 */
internal val MIGRATION_1_2: Migration = object : Migration(1, 2) {
  override fun migrate(database: SupportSQLiteDatabase) {
    database.execSQL(
      """
      CREATE TABLE IF NOT EXISTS user_info (
        id INTEGER NOT NULL, 
        name TEXT NOT NULL, 
  // ・・・(略)
      )
      """
    )
  }


3. DB作成時にmigrationの指定を追加

Room.databaseBuilder(context, AppDatabase::class.java, "test-db")
      .build()

   ↓

Room.databaseBuilder(context, AppDatabase::class.java, "test-db")
      .addMigrations(MIGRATION_1_2)
      .build()

※MIGRATION_2_3が必要になった場合は.addMigrations(MIGRATION_1_2, MIGRATION_2_3)の様に追記していく。


4. buildすると 2.json が自動生成される


以上!

何か間違い等あればご指摘お願いしますmm



その他メモ
  • 最初手順 1. のversion指定せずにbuildしてしまったら、1.json の方が更新されて2.jsonが生成されずハマりました。

  • MIGRATION_2_3 をしたいときはMIGRATION_1_3 は不要

  • migration怖いですよね。。



次はroom migration の test について書きます。