[译] Realm 修改对象模式 - Android SDK

原文: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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值