Los siguientes ejemplos muestran cómo agregar, eliminar y modificar propiedades en un esquema. Primero, realice el cambio de esquema requerido. Luego, incremente la versión del esquema. Finalmente, si el cambio es perjudicial (destructivo), cree la versión correspondiente. función de migración para mover datos del esquema original al esquema actualizado.
Nota
Actualización de versiones en Realm Open
Supongamos que cada cambio de esquema que se muestra en el siguiente ejemplo ocurre después de que la aplicación haya usado el esquema existente. Los nuevos números de versión del esquema solo se aplican después de abrir el dominio y especificar explícitamente el nuevo número de versión. En otras palabras, no se puede especificar la versión 3 sin especificar y usar previamente las versiones 0, 1 y 2.
Un reino que utiliza la versión del esquema 0 tiene un tipo de objeto Person:
public class Person extends RealmObject { // Realm schema version 0 public String firstName; public int age; }
class Person: RealmObject { // Realm schema version 0 var firstName: String = "" var age: int = 0 }
A. Agregar una propiedad
El siguiente ejemplo agrega una lastName propiedad al esquema Persona original:
public class Person extends RealmObject { // Realm schema version 1 public String firstName; public String lastName; public int age; }
class Person: RealmObject { // Realm schema version 1 var firstName: String = "" var lastName: String = "" var age: int = 0 }
B. Borrar una Propiedad
El siguiente ejemplo utiliza una fullName propiedad combinada firstName lastName en lugar de las propiedades separadas y del esquema Person original:
public class Person extends RealmObject { // Realm schema version 2 public String fullName; public int age; }
class Person: RealmObject { // Realm schema version 2 var fullName: String = "" var age: int = 0 }
C. Modificar un tipo de propiedad o cambiar el nombre de una propiedad
El siguiente ejemplo modifica la age propiedad en el esquema Persona original renombrándola a birthday y cambiando el tipo Date a:
public class Person extends RealmObject { // Realm schema version 3 public String fullName; public Date birthday = new Date(); }
class Person: RealmObject { // Realm schema version 3 var fullName: String = "" var birthday: Date = Date() }
D. Funciones de migración
Para migrar el reino para que se ajuste al Person esquema actualizado, configure la versión del esquema del reino en y 3 defina una función de migración para establecer el valor de en fullName función de las propiedades y existentes firstName lastName y el valor de birthday en función age de:
public class Migration implements RealmMigration { public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { Long version = oldVersion; // DynamicRealm exposes an editable schema RealmSchema schema = realm.getSchema(); // 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, FieldAttribute.REQUIRED); version++; } // Changes from version 1 to 2: combine firstName/lastName into fullName if (version == 1L) { schema.get("Person") .addField("fullName", String.class, FieldAttribute.REQUIRED) .transform( DynamicRealmObject obj -> { String 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(DynamicRealmObject obj -> { Int birthYear = Date().year - obj.getInt("age"); obj.setDate("birthday", Date(birthYear, 1, 1)); }) .removeField("age"); version++; } } }; public class Module {} RealmConfiguration config = new RealmConfiguration.Builder() .modules(new Module()) .schemaVersion(3) // Must be bumped when the schema changes .migration(new Migration()) // Migration to run instead of throwing an exception .build();
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++ } } } 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()
Puede realizar cambios en el esquema de un dominio sincronizado modificando el esquema JSON definido en el backend de su aplicación. Los dominios sincronizados no requieren funciones de migración, ya que los cambios importantes en los esquemas sincronizados causan errores de sincronización. Sync gestiona automáticamente los cambios permanentes en los esquemas de dominio sincronizados. Como resultado, tanto las versiones antiguas como las nuevas de su esquema pueden sincronizarse a medida que los usuarios actualizan sus aplicaciones.
Para aprender más sobre los cambios en el esquema de los reinos sincronizados, consulta cambios de esquema sincronizados.
Nota
Modo de desarrollo: solo para definir tu esquema inicial
Puedes definir la primera versión del esquema sincronizado de tu aplicación mediante el modo de desarrollo, que traduce automáticamente los modelos de cliente a un esquema JSON en el backend. Sin embargo, debes realizar cambios posteriores en tu esquema editando el esquema JSON en tu aplicación.
Tip
Puedes usar el método de construcción RealmConfiguration.shouldDeleteRealmIfMigrationNeeded() al construir un reino para eliminarlo en lugar de realizar una migración cuando sea necesario. Esto puede ser útil durante el desarrollo, cuando los esquemas cambian con frecuencia.