Overview
Una migraci贸n transforma un reino existente y sus objetos de su estado actual. Versi贸n del esquema de dominio a una m谩s reciente. Los modelos de datos de las aplicaciones suelen cambiar con el tiempo para adaptarse a nuevos requisitos y funciones. Las migraciones le ofrecen la flexibilidad de actualizar autom谩ticamente los datos de su aplicaci贸n existente cada vez que una aplicaci贸n cliente se actualiza a una versi贸n m谩s reciente.
Consideremos el siguiente ejemplo, en el que tenemos un RealmObject
llamada "Persona":
public partial class Person : IRealmObject { [] [] public ObjectId Id { get; set; } public string FullName { get; set; } public int Age { get; set; } }
Supongamos que ahora queremos dividir la propiedad FullName en dos propiedades separadas, FirstName y LastName:
public partial class Person : IRealmObject { [] [] public ObjectId Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
En este punto, hay una discrepancia entre el modelo y los datos guardados y se lanzar谩 una excepci贸n cuando intente abrir el reino.
Versi贸n del esquema
La versi贸n del esquema identifica el estado de un esquema de dominio en un momento dado. Dominio rastrea la versi贸n del esquema de cada dominio y la utiliza para asignar los objetos de cada dominio al esquema correcto.
Las versiones del esquema son n煤meros enteros que se pueden incluir en la configuraci贸n del dominio al abrirlo. Si una aplicaci贸n cliente no especifica un n煤mero de versi贸n al abrir un dominio, este se establece como 0 de forma predeterminada.
Importante
Incrementar versiones mon贸tonamente
Las migraciones deben actualizar un dominio a una versi贸n de esquema superior. El dominio generar谩 un error si una aplicaci贸n cliente abre un dominio con una versi贸n de esquema inferior a la actual, o si la versi贸n de esquema especificada coincide con la actual, pero incluye esquemas de objetos diferentes.
Migrar un esquema
Los siguientes ejemplos muestran c贸mo agregar, eliminar y modificar propiedades en un esquema. Primero, realice el cambio de esquema necesario. Luego, cree la funci贸n de migraci贸n correspondiente para mover los datos del esquema original al esquema actualizado.
Nota
Modificar las propiedades del esquema de un dominio sincronizado
La siguiente p谩gina muestra c贸mo modificar las propiedades del esquema de un dominio local. Aprenda a modificar las propiedades del esquema de un dominio sincronizado.
Nota
Actualizaci贸n de versiones en Realm Open
Supongamos que cada cambio de esquema en este ejemplo ocurre despu茅s de que una aplicaci贸n haya usado cada versi贸n durante un tiempo. Los nuevos n煤meros de versi贸n del esquema solo se aplican al abrir el dominio con un esquema actualizado y especificar expl铆citamente el nuevo n煤mero de versi贸n. Por lo tanto, para llegar a la versi贸n 3, primero deber谩 abrir la aplicaci贸n con las versiones 1 y 2.
Un reino que utiliza la versi贸n de esquema 1 tiene un tipo de objeto Person:
public partial class Person : IRealmObject { [] [] public ObjectId Id { get; set; } public string FirstName { get; set; } public int Age { get; set; } }
Agregar una propiedad
El siguiente ejemplo agrega una LastName propiedad al esquema Persona original:
public partial class Person : IRealmObject { [] [] public ObjectId Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
Eliminar una propiedad
El siguiente ejemplo utiliza una FullName propiedad combinada FirstName LastName en lugar de las propiedades separadas y del esquema Person original:
public partial class Person : IRealmObject { [] [] public ObjectId Id { get; set; } public string FullName { get; set; } public int Age { get; set; } }
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 DateTimeOffset a:
public partial class Person : IRealmObject { [] [] public ObjectId Id { get; set; } public string FullName { get; set; } public DateTimeOffset Birthday { get; set; } }
Funciones de migraci贸n
Tip
Evitar la migraci贸n durante el desarrollo
Al desarrollar o depurar su aplicaci贸n, puede que prefiera eliminar el dominio en lugar de migrarlo. Use el indicador ShouldDeleteIfMigrationNeeded para eliminar la base de datos autom谩ticamente cuando una discrepancia de esquema requiera una migraci贸n.
Nunca publique una aplicaci贸n en producci贸n con esta marca configurada en true.
Para migrar el reino para que se ajuste al Person esquema actualizado, configure la versi贸n del esquema del reino en y 4 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:
1 var config = new RealmConfiguration 2 { 3 SchemaVersion = 4, 4 MigrationCallback = (migration, oldSchemaVersion) => 5 { 6 var oldVersionPeople = migration.OldRealm.DynamicApi.All("Person"); 7 var newVersionPeople = migration.NewRealm.All<Person>(); 8 9 // Migrate Person objects 10 for (var i = 0; i < newVersionPeople.Count(); i++) 11 { 12 var oldVersionPerson = oldVersionPeople.ElementAt(i); 13 var newVersionPerson = newVersionPeople.ElementAt(i); 14 15 // Changes from version 1 to 2 (adding LastName) will 16 // occur automatically when Realm detects the change 17 18 // Migrate Person from version 2 to 3: 19 // Replace FirstName and LastName with FullName 20 // LastName doesn't exist in version 1 21 var firstName = oldVersionPerson.DynamicApi.Get<string>("FirstName"); 22 var lastName = oldVersionPerson.DynamicApi.Get<string>("LastName"); 23 24 if (oldSchemaVersion < 2) 25 { 26 newVersionPerson.FullName = firstName; 27 } 28 else if (oldSchemaVersion < 3) 29 { 30 newVersionPerson.FullName = $"{firstName} {lastName}"; 31 } 32 33 // Migrate Person from version 3 to 4: replace Age with Birthday 34 if (oldSchemaVersion < 4) 35 { 36 var birthYear = 37 DateTimeOffset.UtcNow.Year - oldVersionPerson.DynamicApi.Get<int>("Age"); 38 newVersionPerson.Birthday = 39 new DateTimeOffset(birthYear, 1, 1, 0, 0, 0, TimeSpan.Zero); 40 } 41 } 42 } 43 }; 44 var realm = Realm.GetInstance(config);