Docs Menu
Docs Home
/ /
Datos del modelo

Cambiar un modelo de objeto - SDK de Java

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
@Required
public String firstName;
@Required
public int age;
}
class Person: RealmObject { // Realm schema version 0
var firstName: String = ""
var age: int = 0
}

El siguiente ejemplo agrega una lastName propiedad al esquema Persona original:

public class Person extends RealmObject { // Realm schema version 1
@Required
public String firstName;
@Required
public String lastName;
@Required
public int age;
}
class Person: RealmObject { // Realm schema version 1
var firstName: String = ""
var lastName: String = ""
var age: int = 0
}

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
@Required
public String fullName;
@Required
public int age;
}
class Person: RealmObject { // Realm schema version 2
var fullName: String = ""
var age: int = 0
}

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
@Required
public String fullName;
@Required
public Date birthday = new Date();
}
class Person: RealmObject { // Realm schema version 3
var fullName: String = ""
var birthday: Date = Date()
}

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 {
@Override
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++;
}
}
};
@RealmModule(classes = { Person.class })
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++
}
}
}
@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()

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

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.

Volver

Relaciones