原文:https://docs.mongodb.com/realm/sdk/android/examples/modify-an-object-schema
以下示例演示了如何在模式中添加、删除和修改属性。首先,进行所需的模式更改。然后,创建相应的迁移函数,将数据从原始模式移动到更新后的模式。
使用模式版本的领域0具有Person对象类型:
class Person: RealmObject { // Realm schema version 0
var firstName: String = ""
var age: int = 0
}
添加属性
以下示例向原始 Person 模式添加了一个 lastName 属性 :
class Person: RealmObject { // Realm schema version 1
var firstName: String = ""
var lastName: String = ""
var age: int = 0
}
删除属性
以下示例使用组合 fullName 属性而不是原始 Person 模式中的单独的 firstName 和 lastName 属性:
class Person: RealmObject { // Realm schema version 2
var fullName: String = ""
var age: int = 0
}
修改属性类型或重命名属性
以下示例通过将原始 Person 模式中的 age 属性重命名为 birthday 并将类型更改为 Date :
class Person: RealmObject { // Realm schema version 3
var fullName: String = ""
var birthday: Date = Date()
}
迁移函数
要迁移 Realm 以符合更新的 Person 模式,请将 Realm 的模式版本设置为 3 并定义迁移函数以基于现有 firstName 和 lastName 属性的值来设置 fullName 的值以及基于 age 的值来设置 birthday 的值:
val migration = object: RealmMigration {
override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
var version: Long = oldVersion
// DynamicRealm exposes an editable schema
val schema: RealmSchema = realm.schema
// Changes from version 0 to 1: Adding lastName.
// All properties will be initialized with the default value "".
if (version == 0L) {
schema.get("Person")!!
.addField("lastName", String::class.java, FieldAttribute.REQUIRED)
version++
}
// Changes from version 1 to 2: Combining firstName/lastName into fullName
if (version == 1L) {
schema.get("Person")!!
.addField("fullName", String::class.java, FieldAttribute.REQUIRED)
.transform { obj: DynamicRealmObject ->
val name = "${obj.getString("firstName")} ${obj.getString("lastName")}"
obj.setString("fullName", name)
}
.removeField("firstName")
.removeField("lastName")
version++
}
// Changes from version 2 to 3: Replace age with birthday
if (version == 2L) {
schema.get("Person")!!
.addField("birthday", Date::class.java, FieldAttribute.REQUIRED)
.transform { obj: DynamicRealmObject ->
var birthYear = Date().year - obj.getInt("age")
obj.setDate("birthday", Date(birthYear, 1, 1))
}
.removeField("age")
version++
}
}
}
@RealmModule(classes = { Person::class.java })
class Module
val config = RealmConfiguration.Builder()
.schemaVersion(3) // Must be bumped when the schema changes
.migration(migration) // Migration to run instead of throwing an exception
.build()