Room学习笔记--迁移

335 阅读1分钟

升级注意事项:

1.手动升级,在低于2.4.0版本升级是需要手动升级的 主要缺陷是:1.需要自己手写sql;2.面对大量的新增字段的话会很繁琐。 具体可以查看官方说明:手动定义迁移

Kotlin写法的话,需要注意点是:entity中指定的字段类型是否可为空,若不为空,则在sql语句需要给个默认值例如添加一个interge类型:

entity:
@ColumnInfo(name = "step_status", defaultValue = "0")
val status: Int,


private val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        //FRUIT 表  新增一列,不为null,默认初始值为0
        database.execSQL("ALTER TABLE step_table ADD COLUMN step_status INTEGER NOT NULL DEFAULT 0")
    }
}

2.自动迁移

注意:Room 在 2.4.0-alpha01 及更高版本中支持自动迁移。如果您的应用使用的是较低版本的 Room,则必须。

官方示例:

// Database class before the version update.
@Database(
  version = 1,
  entities = [User::class]
)
abstract class AppDatabase : RoomDatabase() {
  ...
}

// Database class after the version update.
@Database(
  version = 2,
  entities = [User::class],
  autoMigrations = [
    AutoMigration (from = 1, to = 2)
  ]
)
abstract class AppDatabase : RoomDatabase() {
  ...
}

注意:需要在gradle配置下schemas android defaultConfig下配置

javaCompileOptions {
    annotationProcessorOptions {
        arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
    }
}

android下添加

sourceSets {
    androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
}

一般的流程: 1.新增字段的话,直接在entity里面新建字段 2.version升高 3.指定升级版本:AutoMigration(from = x, to = y)

升级表也是类似:直接新建表其他操作跟字段一致。

暂时记录到这里。