Declarar propiedades de relación
Tip
Alternativamente, puedes Define tus relaciones en tu aplicación App Services.
Definir una propiedad de relación de uno a uno
Una relación a uno asigna una propiedad a una sola instancia de otro tipo de objeto. Por ejemplo, se puede modelar una persona con un perro como máximo como una relación a uno.
Si se configura un campo de relación como nulo, se remueve la conexión entre objetos. De todas maneras, Realm no elimina el objeto referenciado, a menos que sea un objeto incrustado.
Importante
Las relaciones de uno a uno deben ser opcionales
Al declarar una relación "a-uno" en el modelo de objetos, esta debe ser una propiedad opcional. Si se intenta que la relación "a-uno" sea obligatoria, Realm genera una excepción en tiempo de ejecución.
// Dog.h @interface Dog : RLMObject @property NSString *name; // No backlink to person -- one-directional relationship @end // Define an RLMArray<Dog> type RLM_COLLECTION_TYPE(Dog) // Person.h @interface Person : RLMObject @property NSString *name; // A person can have one dog @property Dog *dog; @end // Dog.m @implementation Dog @end // Person.m @implementation Person @end
class Person: Object { var name: String = "" var birthdate: Date = Date(timeIntervalSince1970: 1) // A person can have one dog var dog: Dog? } class Dog: Object { var name: String = "" var age: Int = 0 var breed: String? // No backlink to person -- one-directional relationship }
Tip
Para obtener más información sobre las relaciones de uno a uno, consulte: Relación de uno a uno.
Si su aplicación utiliza Sincronización de dispositivos, consulte la página Datos de modelo con sincronización de dispositivos para obtener información sobre cómo la relación a uno en los modelos de objetos Swift se traduce a los documentos Atlas.
Definir una propiedad de relación de muchos
Una relación de varios asigna una propiedad a cero o más instancias de otro tipo de objeto. Por ejemplo, se puede modelar una persona con cualquier número de perros de compañía como una relación de varios.
Utiliza RLMArray etiquetado con el tipo de tu objetivo para definir tu propiedad de relación de uno a muchos.
Tip
Recuerde utilizar el RLM_COLLECTION_TYPE() macro con su tipo para declarar el protocolo RLMArray para su tipo.
// Dog.h @interface Dog : RLMObject @property NSString *name; // No backlink to person -- one-directional relationship @end // Define an RLMArray<Dog> type RLM_COLLECTION_TYPE(Dog) // Person.h @interface Person : RLMObject @property NSString *name; // A person can have many dogs @property RLMArray<Dog *><Dog> *dogs; @end // Dog.m @implementation Dog @end // Person.m @implementation Person @end
Utilice la lista etiquetada con su tipo de destino para definir su propiedad de relación de muchos.
class Person: Object { var name: String = "" var birthdate: Date = Date(timeIntervalSince1970: 1) // A person can have many dogs var dogs: List<Dog> } class Dog: Object { var name: String = "" var age: Int = 0 var breed: String? // No backlink to person -- one-directional relationship }
Tip
Para obtener más información sobre las relaciones de muchos, consulte: Relación de muchos.
Si su aplicación utiliza Sincronización de dispositivos, consulte la página Datos de modelo con sincronización de dispositivos para obtener información sobre cómo la relación de muchos en los modelos de objetos Swift se traduce a los documentos Atlas.
Definir una propiedad de relación inversa
Una propiedad de relación inversa es una relación de retroenlace automática. Realm actualiza automáticamente las relaciones implícitas al añadir o eliminar un objeto en una lista de correspondencia a varios o en una propiedad de relación a uno. No se puede establecer manualmente el valor de una propiedad de relación inversa.
Para definir una relación inversa, utilice LinkingObjects en su modelo de objetos. La LinkingObjects definición especifica el tipo de objeto y el nombre de la propiedad de la relación que invierte.
class User: Object { (primaryKey: true) var _id: ObjectId var _partition: String = "" var name: String = "" // A user can have many tasks. var tasks: List<Task> } class Task: Object { (primaryKey: true) var _id: ObjectId var _partition: String = "" var text: String = "" // Backlink to the user. This is automatically updated whenever // this task is added to or removed from a user's task list. (originProperty: "tasks") var assignee: LinkingObjects<User> }
Para definir una relación inversa, utilice RLMLinkingObjects en su modelo de objetos. Anule el método +[RLMObject linkingObjectProperties] en su clase para especificar el tipo de objeto y el nombre de la propiedad de la relación que invierte.
// Task.h @interface Task : RLMObject @property NSString *description; @property (readonly) RLMLinkingObjects *assignees; @end // Define an RLMArray<Task> type RLM_COLLECTION_TYPE(Task) // User.h @interface User : RLMObject @property NSString *name; @property RLMArray<Task *><Task> *tasks; @end // Task.m @implementation Task + (NSDictionary *)linkingObjectsProperties { return @{ @"assignees": [RLMPropertyDescriptor descriptorWithClass:User.class propertyName:@"tasks"], }; } @end // User.m @implementation User @end
Para definir una relación inversa, utilice LinkingObjects en su modelo de objetos. La LinkingObjects definición especifica el tipo de objeto y el nombre de la propiedad de la relación que invierte.
class User: Object { @objc dynamic var _id: ObjectId = ObjectId.generate() @objc dynamic var _partition: String = "" @objc dynamic var name: String = "" // A user can have many tasks. let tasks = List<Task>() override static func primaryKey() -> String? { return "_id" } } class Task: Object { @objc dynamic var _id: ObjectId = ObjectId.generate() @objc dynamic var _partition: String = "" @objc dynamic var text: String = "" // Backlink to the user. This is automatically updated whenever // this task is added to or removed from a user's task list. let assignee = LinkingObjects(fromType: User.self, property: "tasks") override static func primaryKey() -> String? { return "_id" } }
Tip
Para obtener más información sobre las relaciones inversas, consulte: Relación inversa.
Si su aplicación utiliza Sincronización de dispositivos, consulte la página Datos de modelo con sincronización de dispositivos para obtener información sobre cómo la relación inversa en los modelos de objetos Swift se traduce a los documentos Atlas.
Definir una propiedad de objeto incrustado
Un objeto incrustado existe como datos anidados dentro de un único objeto padre específico. Hereda el ciclo de vida de su objeto padre y no puede existir como un objeto independiente de Realm. Realm elimina automáticamente los objetos incrustados si su objeto padre es eliminado o cuando es sobrescrito por una nueva instancia de objeto incrustado.
Nota
Realm utiliza eliminaciones en cascada para objetos incrustados
Al eliminar un objeto Realm, todos los objetos incrustados referenciados por él se eliminan con él. Si desea que los objetos referenciados persistan tras la eliminación del objeto principal, su tipo no debe ser un objeto incrustado. En su lugar, utilice un objeto Realm normal con una relación de uno a uno.
Puedes definir un objeto incrustado derivando de la clase RLMEmbeddedObject. Puedes usar tu objeto incrustado en otro modelo como cualquier otro tipo.
// Define an embedded object @interface Address : RLMEmbeddedObject @property NSString *street; @property NSString *city; @property NSString *country; @property NSString *postalCode; @end // Enable Address for use in RLMArray RLM_COLLECTION_TYPE(Address) @implementation Address @end // Define an object with one embedded object @interface Contact : RLMObject @property NSString *name; // Embed a single object. @property Address *address; @end @implementation Contact @end // Define an object with an array of embedded objects @interface Business : RLMObject @property NSString *name; // Embed an array of objects @property RLMArray<Address *><Address> *addresses; @end
Puedes definir un objeto incrustado derivando de la clase EmbeddedObject. Puedes usar tu objeto incrustado en otro modelo como cualquier otro tipo.
class Person: Object { (primaryKey: true) var id = 0 var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> // Inverse relationship - a person can be a member of many clubs (originProperty: "members") var clubs: LinkingObjects<DogClub> // Embed a single object. // Embedded object properties must be marked optional. var address: Address? convenience init(name: String, address: Address) { self.init() self.name = name self.address = address } } class DogClub: Object { var name = "" var members: List<Person> // DogClub has an array of regional office addresses. // These are embedded objects. var regionalOfficeAddresses: List<Address> convenience init(name: String, addresses: [Address]) { self.init() self.name = name self.regionalOfficeAddresses.append(objectsIn: addresses) } } class Address: EmbeddedObject { var street: String? var city: String? var country: String? var postalCode: String? }
Tip
Si su aplicación utiliza Sincronización de dispositivos, consulte la página Datos de modelo con sincronización de dispositivos para obtener información sobre cómo los objetos integrados en los modelos de objetos Swift se traducen a documentos Atlas.