Object Types & Schemas
Realm applications model data as objects composed of field-value pairs that each contain one or more supported data types.
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() }
Realm Schema
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.
By default, the Swift SDK automatically adds all classes in your project that derive from RLMObject or RLMEmbeddedObject to the realm schema.
Tip
Configure Your Realm Schema
To control which classes Realm adds to a realm schema, see Provide a Subset of Classes to a Realm.
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
You can subclass Realm models to share behavior between classes, but there are limitations. In particular, Realm does not allow you to:
Conversión entre clases polimórficas: subclase a subclase, subclase a padre, padre a subclase
Query en varias clases simultáneamente: por ejemplo, "obtener todas las instancias de la clase principal y la subclase"
Contenedores de múltiples clases:
ListyResultscon una mezcla de clase padre y subclase.
Tip
Check out the code samples for working around these limitations.
New in version 10.10.0: While you can't mix @Persisted and @objc dynamic property declarations within a class, you can mix the notation styles across base and subclasses. For example, a base class could have a @Persisted var foo: Int property, and a subclass could have an @objc dynamic var bar = 0 property, with both persisted. However, the @objc dynamic property would be ignored if the @Persisted property were within the same base or subclass.
Swift Structs
Realm does not support Swift structs as models for a variety of reasons. Realm's design focuses on "live" objects. This concept is not compatible with value type structs. By design, Realm provides features that are incompatible with these semantics, such as:
Bajo consumo de memoria de los datos
Buen rendimiento de las operaciones
Lack of data serialization/deserialization
That said, it is sometimes useful to detach objects from their backing realm. This typically isn't an ideal design decision. Instead, developers use this as a workaround for temporary limitations in our library.
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:
The data type and whether the property is optional or required
Si Realm debe almacenar o ignorar la propiedad
Si la propiedad es una llave primaria o se debe indexar
Las propiedades también son el mecanismo para establecer relaciones entre los tipos de objetos de Realm.
The Realm Swift SDK uses reflection to determine the properties in your models at runtime. Your project must not set SWIFT_REFLECTION_METADATA_LEVEL = none, or Realm cannot discover children of types, such as properties and enum cases. Reflection is enabled by default if your project does not specifically set a level for this setting.
View Models with Realm
New in version 10.21.0.
Puedes trabajar con un subconjunto de las propiedades del objeto Realm creando una proyección de clase. Una proyección de clase es una clase que pasa o transforma algunas o todas las propiedades del objeto Realm. La proyección de clase te permite crear modelos de vista que utilizan una abstracción del Modelo de objeto. Esto simplifica el uso y prueba de objetos Realm en tu aplicación.
With class projection, you can use a subset of your object's properties directly in the UI or transform them. When you use a class projection for this, you get all the benefits of Realm's live objects:
The class-projected object live updates
Puedes observar los cambios.
You can apply changes directly to the properties in write transactions
Relaciones
Realm doesn't use bridge tables or explicit joins to define relationships as you would in a relational database. Realm handles relationships through embedded objects or reference properties to other Realm objects. You read from and write to these properties directly. This makes querying relationships as performant as querying against any other property.
Realm supports to-one, to-many, and inverse relationships.
To-One Relationship
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
To learn how to define a to-one relationship, see Define a To-One Relationship Property.
Relación de muchos
Una relación de uno a muchos significa que un objeto se relaciona con más de otro objeto. En Realm, una relación de uno a muchos es una lista de referencias a otros objetos. Por ejemplo, una persona podría tener muchos perros.
A List represents the to-many relationship between two Realm types. Lists are mutable: within a write transaction, you can add and remove elements to and from a list. Lists are not associated with a query and are usually declared as a property of an object model.
Tip
To learn how to define a to-many relationship, see Define a To-Many Relationship Property.
Relación inversa
Relationship definitions in Realm are unidirectional. An inverse relationship links an object back to an object that refers to it. You must explicitly define a property in the object's model as an inverse relationship. Inverse relationships can link back to objects in a to-one or to-many relationship.
A LinkingObjects collection represents the inverse relationship between two Realm types. You cannot directly add or remove items from a LinkingObjects collection.
Inverse relationships automatically update themselves with corresponding backlinks. You can find the same set of Realm objects with a manual query, but the inverse relationship field reduces boilerplate query code and capacity for 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 cuando se agrega o elimina un objeto en la relación.
Relationships can be many-to-one or many-to-many. So following inverse relationships can result in zero, one, or many objects.
Tip
To learn how to define an inverse relationship, see Define an Inverse Relationship Property.