Docs Menu
Docs Home
/ /
Datos del modelo

Definir un esquema de objeto de reino - SDK de Flutter

Importante

Cambio importante en los archivos generados del SDK de Flutter v2.0.0

La versión 2.0.0 del SDK de Flutter introduce una actualización del compilador que afecta la generación de archivos. En la versión2.0.0 y posteriores, todos los archivos generados usan .realm.dart convención de nombres en lugar de .g.dart.

Este es un cambio importante para las aplicaciones existentes. Para obtener información sobre cómo actualizar una aplicación existente desde una versión anterior del SDK a la v2.0.0 o posterior, consulta "Actualizar a la v del SDK de Flutter".2.0.0

Un esquema de objeto es un objeto de configuración que define las propiedades y relaciones de un objeto de Realm. Las aplicaciones cliente de Realm definen esquemas de objeto con la implementación de la clase nativa en su lenguaje correspondiente mediante el esquema de objeto.

Los esquemas de objeto especifican restricciones sobre las propiedades de los objetos, como el tipo de dato de cada propiedad y si una propiedad es obligatoria o no. Los esquemas también pueden definir relaciones entre los tipos de objetos de un dominio.

1

Importe el paquete Realm SDK en la parte superior de su archivo.

esquemas.dart
import 'package:realm/realm.dart';
esquemas.dart
import 'package:realm_dart/realm.dart';
2

Cambiado en la versión2.0.0 v: Los archivos generados se llaman en .realm.dart lugar de .g.dart

Añade una directiva de parte para incluir el archivo RealmObject que generaste en el paso 4 en el mismo paquete que el archivo en el que estás trabajando actualmente.

esquemas.dart
part 'schemas.realm.dart';
3

Crea el modelo para tu esquema de Realm. Debes incluir la anotación. Modelo de reino en la parte superior de la definición de clase.

Utilizará RealmModel para generar el RealmObject público utilizado en toda la aplicación en el paso 4.

Puedes configurar el modelo como privado o público. Recomendamos configurar todos los modelos como privados y definirlos en un solo archivo. Para hacerlo privado, añade un guion bajo (_) al nombre de la clase.

Si necesita definir su esquema en varios archivos, puede hacer público el RealmModel. Anteponga el nombre con un signo de dólar ($) para que el modelo sea público. Debe hacer esto para generar el RealmObject a partir del RealmModel, como se describe en el paso 4.

Añade campos RealmModel a. Puedes añadir todos los tipos de datos compatibles. Incluye comportamiento adicional mediante anotaciones de propiedades.

esquemas.dart
@RealmModel()
class _Car {
@PrimaryKey()
late ObjectId id;
late String make;
late String? model;
late int? miles;
}

Nota

Los nombres de clase están limitados a un máximo de 57 caracteres UTF-8.

4

Cambiado en la versión2.0.0 v: Los archivos generados se llaman en .realm.dart lugar de .g.dart

Genera el RealmObject que utilizarás en tu aplicación:

dart run realm generate
dart run realm_dart generate

Este comando genera el archivo en el mismo directorio que el archivo del modelo. Tiene el nombre especificado en la directiva de pieza del paso 2.

Tip

Seguimiento del archivo generado

Realice un seguimiento del archivo generado en su sistema de control de versiones, como git.

Ejemplo

Estructura del archivo después de generar el modelo

.
├── schemas.dart
├── schemas.realm.dart // newly generated file
├── myapp.dart
└── ...rest of application
5

Utilice el RealmObject que generó en el paso anterior en su aplicación. Dado que incluyó el archivo generado como parte del mismo paquete donde definió el RealmModel en el paso 2, acceda al RealmObject importando el archivo con el RealmModel.

mi aplicación.dart
import './schemas.dart';
final hondaCivic = Car(ObjectId(), 'Honda', model: 'Civic', miles: 99);

Un esquema de App Services es una lista de esquemas de objetos válidos, cada uno de los cuales define un tipo de objeto que una aplicación puede conservar. Todos los objetos sincronizados en un dominio deben cumplir con el esquema de App Services.

Las aplicaciones cliente proporcionan un esquema de objeto al abrir un dominio. Si un dominio ya contiene datos, ya tiene un esquema, y ​​al abrirlo, Realm valida el esquema en el cliente comparándolo con el esquema existente.

Puede definir esquemas de servicios de aplicaciones de las siguientes maneras:

  • Automáticamente con el esquema de objeto si el modo de desarrollo está habilitado.

  • Defina explícitamente el esquema de servicios de aplicaciones con Servicios de aplicaciones.

En su esquema, debe utilizar la anotación MapTo("_id") con su clave principal en RealmModel para sincronizar exitosamente su esquema de objeto con App Services.

@RealmModel()
class _SyncSchema {
@PrimaryKey()
@MapTo("_id")
late ObjectId id;
// ... other properties
}

Para obtener más información sobre cómo definir su esquema y cuál de estos enfoques debería considerar para su aplicación, consulte la documentación Crear un esquema de reino.

Los esquemas de dominio admiten muchos tipos de datos del lenguaje Dart, además de algunos tipos específicos de dominio. Para obtener una referencia completa de todos los tipos de datos compatibles, consulte Tipos de datos.

Utiliza anotaciones para añadir funcionalidades a las propiedades en tus modelos de objetos Realm. Puede usar anotaciones para cosas como marcar una propiedad como nullable, establecer una clave primaria, ignorar una propiedad y más. Para obtener más información sobre las anotaciones de propiedades disponibles, consulta Anotaciones de Propiedades.

Puedes definir relaciones entre objetos de Realm en tu esquema. El SDK de Flutter para Realm admite relaciones a uno, a muchos, inversas e incrustación de objetos dentro de otros. Para obtener más información sobre cómo definir relaciones en el esquema de objetos de Realm, consulta Relaciones.

Puede usar la anotación MapTo para asignar un modelo de objeto o propiedad de Realm a un nombre almacenado diferente en Realm. Esto puede ser útil en los siguientes casos. Por ejemplo:

  • Para facilitar el trabajo en plataformas donde las convenciones de nomenclatura difieren. Por ejemplo, si los nombres de las propiedades del esquema de sincronización de dispositivos usan mayúsculas y minúsculas, mientras que el proyecto usa mayúsculas y minúsculas.

  • Para cambiar un nombre de clase o campo sin forzar una migración.

  • Para admitir múltiples clases de modelos con el mismo nombre en diferentes paquetes.

  • Para utilizar un nombre de clase que sea más largo que el límite de 57caracteres impuesto por Realm.

Si está utilizando Atlas Device Sync, el nombre que especifique en la MapTo anotación se utilizará como nombre de esquema de App Services persistente.

@RealmModel()
@MapTo('naval_ship')
class _Boat {
@PrimaryKey()
late ObjectId id;
late String name;
late int? maxKnots;
late int? nauticalMiles;
}
class _Vehicle {
@PrimaryKey()
late ObjectId id;
late String? maybeDescription; // optional value
late double milesTravelled = 0; // 0 is default value
@Ignored()
late String notInRealmModel;
@Indexed()
late String make;
@MapTo('wheels') // 'wheels' is property name in the RealmObject
late int numberOfWheels;
}

Nuevo en la versión 2.0.0.

A partir de la versión del SDK de Flutter,2.0.0 puedes almacenar colecciones de datos mixtos dentro de una RealmValue propiedad. Puedes usar esta función para modelar estructuras de datos complejas, como documentos JSON o MongoDB, sin tener que definir un modelo de datos estricto.

Los datos no estructurados son aquellos que no se ajustan fácilmente a un esquema esperado, lo que dificulta o hace poco práctico modelarlos para clases de datos individuales. Por ejemplo, su aplicación podría tener datos muy variables o dinámicos cuya estructura se desconoce en tiempo de ejecución.

Almacenar colecciones en una propiedad mixta ofrece flexibilidad sin sacrificar la funcionalidad, incluyendo una sincronización eficiente al usar Device Sync. Además, puede trabajar con ellas de la misma manera que con una colección no mixta:

  • Puedes anidar colecciones mixtas hasta 100 niveles.

  • Puede consultar y reaccionar ante los cambios en colecciones mixtas.

  • Puede buscar y actualizar elementos de colección mixtos individuales.

Sin embargo, almacenar datos en colecciones mixtas tiene menos rendimiento que usar un esquema estructurado o serializar blobs JSON en una única propiedad de cadena.

Para modelar datos no estructurados en su aplicación, defina las propiedades adecuadas en su esquema como tipos RealmValue. A continuación, puede configurar estas RealmValue propiedades como una colección RealmList o RealmMap de RealmValue elementos. Tenga en cuenta que RealmValue no puede representar un RealmSet ni un objeto incrustado.

Por ejemplo, puede utilizar un RealmValue que contenga un mapa de datos mixtos al modelar un objeto de registro de eventos variable:

Modelo de datos
// Define class with a `RealmValue` property
@RealmModel()
class _EventLog {
@PrimaryKey()
late ObjectId id;
late String eventType;
late DateTime timestamp;
late String userId;
late RealmValue details;
}
Crear datos no estructurados
realm.write(() {
// Add `eventLog` property data as a map of mixed data, which
// also includes nested lists of mixed data
realm.add(EventLog(ObjectId(), 'purchase', DateTime.now(), 'user123',
details: RealmValue.from({
'ipAddress': '192.168.1.1',
'items': [
{'id': 1, 'name': 'Laptop', 'price': 1200.00},
{'id': 2, 'name': 'Mouse', 'price': 49.99}
],
'total': 1249.99
})));
final eventLog = realm.all<EventLog>().first;
final items = eventLog.details.asMap();
print('''
Event Type: ${eventLog.eventType}
Timestamp: ${eventLog.timestamp}
User ID: ${eventLog.userId}
Details:
Item:
''');
for (var item in items.entries) {
print('${item.key}: ${item.value}');
}
Event Type: purchase
Timestamp: 2024-03-18 13:50:58.402979Z
User ID: user123
Details:
Item:
ipAddress: RealmValue(192.168.1.1)
items: RealmValue([RealmValue({id: RealmValue(1), name: RealmValue(Laptop), price: RealmValue(1200.0)}), RealmValue({id: RealmValue(2), name: RealmValue(Mouse), price: RealmValue(49.99)})])
total: RealmValue(1249.99)

Tip

  • Utilice un mapa de tipos de datos mixtos cuando el tipo sea desconocido pero cada valor tendrá un identificador único.

  • Utilice una lista de tipos de datos mixtos cuando el tipo sea desconocido, pero el orden de los objetos sea importante.

Cambiado en la versión2.0.0 v: Los archivos generados se llaman en .realm.dart lugar de .g.dart

Una vez que haya completado su modelo Realm, debe generar la clase RealmObject para usarlo en su aplicación.

Ejecute el siguiente comando para generar RealmObjects:

dart run realm generate
dart run realm_dart generate

Ejecutar esto crea una clase pública en un nuevo archivo en el directorio donde definiste la clase RealmModel según la sección Crear modelo.

El archivo generado tiene el mismo nombre base que el archivo con su RealmModel, terminando en .realm.dart. Por ejemplo, si el archivo con su RealmModel se llama schemas.dart, el archivo generado será schemas.realm.dart.

Nota

Recuerde incluir el archivo generado en una directiva de parte en su archivo de definición RealmModel.

esquemas.dart
// ...import packages
part 'schemas.realm.dart';
@RealmModel()
// ...model definition

Si desea ver sus modelos de datos para generar RealmObjects cada vez que haya un cambio, incluya el indicador --watch en su comando.

dart run realm generate --watch
dart run realm_dart generate --watch

Para limpiar las cachés del generador, incluya el indicador --clean en su comando. Limpiar la caché del generador puede ser útil durante la depuración.

dart run realm generate --clean
dart run realm_dart generate --clean

Nuevo en la versión 1.5.0.

Los objetos asimétricos requieren sincronización flexible. Para definir un objeto asimétrico, pase ObjectType.asymmetricObject a @RealmModel().

@RealmModel(ObjectType.asymmetricObject)
class _WeatherSensor {
@PrimaryKey()
@MapTo("_id")
late ObjectId id;
late String deviceId;
late double modtemperatureInFahrenheitel;
late double barometricPressureInHg;
late double windSpeedInMph;
}

En las versiones y anteriores del SDK de Flutter,1.5.0 no se pueden vincular los asymmetricObject tipos RealmObjects a. En las versiones 1.6.0 y posteriores del SDK, losasymmetricObject tipos pueden vincularse a,RealmObjects además de los tipos de objetos incrustados.

Nota

Intentando leer objetos asimétricos

No se pueden leer objetos asimétricos. Si intenta consultar un objeto asimétrico, obtendrá el siguiente error: "Error: No se puede consultar una clase asimétrica".

Para obtener más información sobre la ingesta de datos, consulte Transmitir datos a Atlas.

Volver

Datos del modelo