Tipos de objetos y esquemas
Las aplicaciones de Realm modelan los datos como objetos compuestos por pares de campo-valor que contienen cada uno uno o más tipos de datos admitidos.
Los objetos Realm son clases Swift u Objective-C estándar, pero también incorporan características adicionales como consultas en tiempo real. El SDK de Swift asigna objetos Realm directamente a objetos nativos de Swift u Objective-C, lo que significa que no es necesario usar una biblioteca especial de acceso a datos, como... ORM. En cambio, puedes trabajar con objetos Realm como lo harías con cualquier otra instancia de clase.
Cada objeto de Realm se ajusta a un tipo de objeto específico, que es esencialmente una clase que define las propiedades y relaciones de los objetos de ese tipo. Realm garantiza que todos los objetos de un reino se ajusten al esquema de su tipo y valida los objetos cada vez que se crean, modifican o eliminan.
Ejemplo
El siguiente esquema define un Dog tipo de objeto con un nombre de cadena, raza de cadena opcional, fecha de nacimiento e ID de clave principal.
// A dog has an _id primary key, a string name, an optional // string breed, and a date of birth. @interface Dog : RLMObject @property RLMObjectId *_id; @property NSString *name; @property NSString *breed; @property NSDate *dateOfBirth; @end @implementation Dog + (NSString *)primaryKey { return @"_id"; } + (NSArray<NSString *> *)requiredProperties { return @[ @"_id", @"name", @"dateOfBirth" ]; } @end
// A dog has an _id primary key, a string name, an optional // string breed, and a date of birth. class Dog: Object { (primaryKey: true) var _id: ObjectId var name = "" var breed: String? var dateOfBirth = Date() }
Esquema de reino
Un esquema de dominio es una lista de esquemas de objetos válidos que un dominio puede contener. Cada objeto de dominio debe cumplir con un tipo de objeto incluido en el esquema de su dominio.
De forma predeterminada, el SDK de Swift agrega automáticamente todas las clases de su proyecto que se derivan de RLMObject o RLMEmbeddedObject al esquema del reino.
Tip
Configurar el esquema de su reino
Para controlar qué clases agrega Realm a un esquema de reino, consulte Proporcionar un subconjunto de clases a un reino.
Si un realm ya contiene datos cuando lo abres, Realm valida cada objeto para garantizar que se haya proporcionado un esquema de objeto para su tipo y que cumpla con todas las restricciones especificadas en el esquema.
Tip
Aprenda a trabajar con un reino
Para obtener ejemplos de código que muestran cómo configurar y abrir un reino en el SDK de Swift, consulte Configurar y abrir un reino - SDK de Swift.
Herencia del modelo
Se pueden subclasificar modelos de Realm para compartir comportamiento entre clases, pero existen limitaciones. En particular, Realm no permite:
Conversión entre clases polimórficas: subclase a subclase, subclase a padre, padre a subclase
Consulta sobre varias clases simultáneamente: por ejemplo, "obtener todas las instancias de la clase principal y la subclase"
Contenedores multiclase:
ListyResultscon una mezcla de clase padre y subclase
Tip
Consulte los ejemplos de código para solucionar estas limitaciones.
Novedades 10.10.0 de la versión: Si bien @Persisted no se @objc dynamic pueden combinar las declaraciones de las propiedades y dentro de una clase, sí se pueden combinar los estilos de notación entre la clase base y las subclases. Por ejemplo, una clase base podría tener una @Persisted var foo: Int propiedad y una subclase, una propiedad, y @objc dynamic var bar = 0 ambas persistirían. Sin embargo, la @objc dynamic propiedad se ignoraría si la @Persisted propiedad estuviera dentro de la misma clase base o subclase.
Estructuras Swift
Realm no admite estructuras Swift como modelos por diversas razones. El diseño de Realm se centra en objetos "vivos". Este concepto no es compatible con estructuras de tipo valor. Por diseño, Realm ofrece características incompatibles con esta semántica, como:
Bajo consumo de memoria de los datos
Buen rendimiento operativo
Falta de serialización/deserialización de datos
Mantener sincronizados gráficos de objetos potencialmente complejos
Dicho esto, a veces resulta útil separar los objetos de su entorno de respaldo. Esto no suele ser una decisión de diseño ideal. En cambio, los desarrolladores lo utilizan como solución temporal para las limitaciones de nuestra biblioteca.
Puede usar la codificación clave-valor para inicializar un objeto no administrado como copia de un objeto administrado. Después, puede trabajar con ese objeto no administrado como cualquier otro NSObject.
let standaloneModelObject = MyModel(value: persistedModelObject)
Propiedades
Tu modelo de objeto Realm es una colección de propiedades. En el nivel más básico, cuando creas tu modelo, tus declaraciones le dan a Realm información sobre cada propiedad:
El tipo de datos y si la propiedad es opcional u obligatoria
Si Realm debe almacenar o ignorar la propiedad
Si la propiedad es una clave principal o debe indexarse
Las propiedades también son el mecanismo para establecer relaciones entre los tipos de objetos de Realm.
El SDK de Swift de Realm utiliza la reflexión para determinar las propiedades de sus modelos en tiempo de ejecución. Su proyecto no debe establecer SWIFT_REFLECTION_METADATA_LEVEL = none; de lo contrario, Realm no podrá detectar elementos secundarios de tipos, como propiedades y casos de enumeración. La reflexión está habilitada de forma predeterminada si su proyecto no establece específicamente un nivel para esta configuración.
Ver modelos con Realm
Nuevo en la versión 10.21.0.
Puedes trabajar con un subconjunto de las propiedades de tu objeto Realm creando una proyección de clase. Una proyección de clase es una clase que transfiere o transforma algunas o todas las propiedades de tu objeto Realm. La proyección de clase te permite crear modelos de vista que utilizan una abstracción de tu modelo de objetos. Esto simplifica el uso y la prueba de objetos Realm en tu aplicación.
Con la proyección de clases, puedes usar un subconjunto de las propiedades de tus objetos directamente en la interfaz de usuario o transformarlas. Al usar una proyección de clases para esto, obtienes todas las ventajas de los objetos activos de Realm:
Las actualizaciones en vivo del objeto proyectado por la clase
Puedes observar los cambios.
Puede aplicar cambios directamente a las propiedades en transacciones de escritura
Relaciones
Realm no utiliza tablas puente ni uniones explícitas para definir relaciones como lo haría en una base de datos relacional. Realm gestiona las relaciones mediante objetos incrustados o propiedades de referencia a otros objetos de Realm. Se leen y escriben directamente en estas propiedades. Esto permite que las consultas sobre relaciones sean tan eficientes como las consultas sobre cualquier otra propiedad.
Realm admite relaciones de uno a muchos e inversas.
Relación de uno a uno
Una relación de uno a uno significa que un objeto se relaciona con otro. Se define una relación de uno a uno para un tipo de objeto en su esquema de objeto. Especifique una propiedad donde el tipo sea el tipo de objeto de Realm relacionado. Por ejemplo, un perro podría tener una relación de uno a uno con su juguete favorito.
Tip
Para aprender a definir una relación de uno a uno, consulte Definir una propiedad de relación de uno a uno.
Relación de muchos
Una relación de varios significa que un objeto se relaciona con más de un objeto. En Realm, una relación de varios es una lista de referencias a otros objetos. Por ejemplo, una persona podría tener muchos perros.
Una lista representa la relación de varios tipos entre dos dominios. Las listas son mutables: dentro de una transacción de escritura, se pueden añadir y eliminar elementos de una lista. Las listas no están asociadas a una consulta y suelen declararse como una propiedad de un modelo de objetos.
Tip
Para aprender a definir una relación de muchos a muchos, consulte Definir una propiedad de relación de muchos a muchos.
Relación inversa
Las definiciones de relaciones en Realm son unidireccionales. Una relación inversa vincula un objeto con un objeto que lo referencia. Debe definir explícitamente una propiedad en el modelo del objeto como una relación inversa. Las relaciones inversas pueden vincularse con objetos en una relación a uno o a muchos.
Una colección de LinkingObjects representa la relación inversa entre dos tipos de dominio. No se pueden agregar ni eliminar elementos directamente de una colección de LinkingObjects.
Las relaciones inversas se actualizan automáticamente con los vínculos de retroceso correspondientes. Se puede encontrar el mismo conjunto de objetos de Realm con una consulta manual, pero el campo de relación inversa reduce el código de consulta repetitivo y la posibilidad de error.
Por ejemplo, considere un rastreador de tareas con la relación "El usuario tiene muchas tareas". Esto no crea automáticamente la relación inversa "La tarea pertenece al usuario". Para crear la relación inversa, agregue una propiedad "Usuario" a la tarea que apunte al propietario de la tarea. Al especificar la relación inversa de la tarea al usuario, puede realizar una consulta al respecto. Si no especifica la relación inversa, debe ejecutar una consulta independiente para buscar al usuario al que está asignada la tarea.
Importante
No se puede establecer manualmente el valor de una propiedad de relación inversa. En su lugar, Realm actualiza las relaciones implícitas al agregar o eliminar un objeto en la relación.
Las relaciones pueden ser de varios a uno o de varios a varios. Por lo tanto, las relaciones inversas pueden dar como resultado cero, uno o muchos objetos.
Tip
Para aprender a definir una relación inversa, consulte Definir una propiedad de relación inversa.