Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Datos del modelo

Actualizar un esquema de objeto de reino - Flutter SDK

Puedes cambiar el esquema de un objeto Realm después de crearlo por primera vez. Dependiendo del tipo de cambios que realices en el esquema, estos pueden aplicarse automáticamente o requerir una actualización manual al nuevo esquema. Las actualizaciones manuales de esquema se denominan migraciones en Realm.

Puede actualizar automáticamente un esquema de objeto de Realm al agregar o eliminar una propiedad de un modelo de objeto de Realm. Para obtener más información, consulte Sección Actualizar esquema automáticamente.

You must perform a manual migration for all other schema changes. For more information, refer to the Manually Migrate Schema section.

Tip

Bypass Migration During Development

Al desarrollar o depurar su aplicación, puede que prefiera eliminar el dominio en lugar de migrarlo. Utilice LocalConfiguration.shouldDeleteIfMigrationNeeded. propiedad para eliminar la base de datos automáticamente cuando una falta de coincidencia de esquema requiere una migración.

Importante

Modificar las propiedades del esquema de un dominio sincronizado

El contenido de esta página solo se aplica a los dominios locales. La migración de esquemas funciona de forma diferente para dominios que utilizan Atlas Device Sync para sincronizar datos con MongoDB Atlas.Consulte la sección "Actualizar el esquema de un dominio sincronizado".

A schema version identifies the state of a realm schema at some point in time. Realm tracks the schema version of each realm and uses it to map the objects in each realm to the correct schema.

Schema versions are ascending integers that you can optionally include in the realm configuration when you open a realm. If a client application does not specify a version number when it opens a realm then the realm defaults to version 0.

Manual migrations must update a realm to a higher schema version. Realm throws an error if a client application opens a realm with a schema version that is lower than the realm's current version or if the specified schema version is the same as the realm's current version but includes different object schemas.

Realm puede migrar automáticamente las propiedades añadidas y eliminadas. Debe actualizar la versión del esquema al realizar estos cambios.

Para agregar una propiedad a un esquema:

  1. Añade la nueva propiedad a la clase RealmModel del objeto.

  2. Regenerate the RealmObject.

  3. Set a schema version to the realm's Configuration object.

Ejemplo

A realm using schema version 1 has a Person object type with a firstName, and lastName property. The developer decides to add an age property to the _Person RealmModel class.

Para cambiar el reino para que se ajuste al Person esquema actualizado, el desarrollador establece la versión del esquema del reino 2 en.

@RealmModel()
class _Person {
late String firstName;
late String lastName;
late int age;
}
final config = Configuration.local([Person.schema], schemaVersion: 2);
final realm = Realm(config);

Para borrar una propiedad de un esquema:

  1. Remove the property from the object's RealmModel class.

  2. Regenerate the RealmObject.

  3. En la configuración del realm, incluye el RealmObject.schema regenerado e incrementa el schemaVersion.

Eliminar una propiedad no afecta a los objetos existentes.

Ejemplo

A realm using schema version 1 has a Person object type with a weight property. The developer decides to remove the property from the schema.

Para migrar el reino para Person que se ajuste al esquema actualizado, el desarrollador establece la versión del esquema del reino 2 en.

final config = Configuration.local([Person.schema], schemaVersion: 2);
final realm = Realm(config);

For more complex schema updates, Realm requires you to manually migrate old instances of a given object to the new schema.

When you open the realm with the updated schema, you must do the following in the realm's Configuration:

  • Increment the schemaVersion property.

  • Define the migration logic in a migrationCallback property of a realm's Configuration. The migration callback has the following parameters:

    • migration:Una instancia de migración con acceso al reino actual, el reino al que está migrando y métodos para ayudar con la operación de migración.

    • oldSchemaVersion: The number of the previous schema version of the realm on the device.

Las siguientes secciones explican cómo realizar diversas operaciones de migración.

To delete all objects of a type from your realm, pass a string representation of the object schema's name to Migration.deleteType().

Esto resulta útil si la versión anterior de un esquema tiene un tipo de objeto Realm, pero la nueva versión del esquema no lo tiene.

final configWithoutPerson = Configuration.local([Car.schema],
schemaVersion: 2,
migrationCallback: ((migration, oldSchemaVersion) {
// Between v1 and v2 we removed the Person type
migration.deleteType('Person');
}));
final realmWithoutPerson = Realm(configWithoutPerson);

Rename a schema property with Migration.renameProperty().

final configWithRenamedAge =
Configuration.local([Person.schema, Car.schema],
schemaVersion: 2,
migrationCallback: ((migration, oldSchemaVersion) {
// Between v1 and v2 we renamed the Person 'age' property to 'yearsSinceBirth'
migration.renameProperty('Person', 'age', 'yearsSinceBirth');
}));
final realmWithRenamedAge = Realm(configWithRenamedAge);

To perform other realm schema migrations, use the following properties of the Migration object in your migration callback function:

  • Migration.oldRealm: El dominio tal como existía justo antes de la migración con la versión anterior del esquema. Debe usar oldRealm la API dinámica de para acceder a sus objetos, ya que no se pueden usar consultas estándar basadas en tipos. La API dinámica permite encontrar objetos de dominio mediante una representación de cadena de su nombre de clase.

  • Migration.newRealm: El dominio tal como existe después de la migración. Al finalizar la devolución de llamada de migración, debe migrar todos los datos afectados por la actualización del esquema oldRealm de newRealm a. Se perderán todos los datos afectados por la actualización del esquema que no se migren.

To find instances of an object in an old realm in the new realm, use Migration.findInNewRealm(). To access the properties of objects from the old schema, use the RealmObjectBase.dynamic API.

final configWithChanges = Configuration.local([Person.schema, Car.schema],
schemaVersion: 2,
migrationCallback: ((migration, oldSchemaVersion) {
// Dynamic query for all Persons in previous schema
final oldPeople = migration.oldRealm.all('Person');
for (final oldPerson in oldPeople) {
// Find Person instance in the updated realm
final newPerson = migration.findInNewRealm<Person>(oldPerson);
if (newPerson == null) {
// That person must have been deleted, so nothing to do.
continue;
}
// Use dynamic API to get properties from old schema and use in the
// new schema
newPerson.fullName = "${oldPerson.dynamic.get<String>("firstName")} ${oldPerson.dynamic.get<String>("lastName")}";
// convert `id` from ObjectId to String
final oldId = oldPerson.dynamic.get<ObjectId>("id");
newPerson.id = oldId.toString();
}
}));
final realmWithChanges = Realm(configWithChanges);

Actualizar el esquema de un realm sincronizado es un proceso separado de la actualización del esquema de un realm sólo local.

Synced realms do not have schema versions and automatically migrate objects to the latest schema. Synced realms only support non-breaking schema changes.

Aprende cómo modificar las propiedades del esquema de un realm sincronizado.

Volver

Property Annotations

En esta página