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.
Tipos de relaciones
Realm admite relaciones uno a uno, uno a muchos e inversas. Realm también ofrece un tipo especial de objeto, denominado objeto incrustado, que es conceptualmente similar a una relación, pero ofrece restricciones adicionales.
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 modelo de objetos. 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.
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.
Puede representar una relación de varios tipos entre dos tipos de dominio como una lista, un mapa o un conjunto. Las listas, los mapas y los conjuntos son mutables: dentro de una transacción de escritura, puede añadir y eliminar elementos de estos tipos de colección. Las listas, los mapas y los conjuntos no están asociados a una consulta y se declaran como una propiedad del modelo de objetos.
Relación inversa
Las definiciones de relaciones en Realm son unidireccionales. Una relación inversa vincula un objeto con un objeto que lo referencia.
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.
Declarar propiedades de relación
Tip
Alternativamente, puedes Define tus relaciones en tu aplicación App Services.
Definir una 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 un perro que tenga como máximo un juguete favorito como una relación a uno.
Establecer un campo de relación como nulo elimina la conexión entre los objetos. Sin embargo, 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.
struct FavoriteToy { realm::primary_key<realm::uuid> _id; std::string name; }; REALM_SCHEMA(FavoriteToy, _id, name) struct Dog { realm::primary_key<realm::uuid> _id; std::string name; int64_t age; // Define a relationship as a link to another SDK object FavoriteToy* favoriteToy; }; REALM_SCHEMA(Dog, _id, name, age, favoriteToy)
Definir una relación de muchos
Una relación a varios asigna una propiedad a cero o más instancias de otro tipo de objeto. Por ejemplo, se puede modelar una empresa con cualquier número de empleados como una relación a varios.
struct Company { int64_t _id; std::string name; // To-many relationships are a list, represented here as a // vector container whose value type is the SDK object // type that the list field links to. std::vector<Employee*> employees; }; REALM_SCHEMA(Company, _id, name, employees)
Definir una relación inversa
Para definir una relación inversa, utilice linking_objects En su modelo de objetos. La definición linking_objects especifica el tipo de objeto y el nombre de la propiedad de la relación que invierte.
En este ejemplo, definimos un Person con una relación de uno a uno con un Dog. El Dog tiene una relación inversa con cualquier objeto Person mediante su propiedad owners.
struct Dog; struct Person { realm::primary_key<int64_t> _id; std::string name; int64_t age = 0; Dog* dog; }; REALM_SCHEMA(Person, _id, name, age, dog) struct Dog { realm::primary_key<int64_t> _id; std::string name; int64_t age = 0; linking_objects<&Person::dog> owners; }; REALM_SCHEMA(Dog, _id, name, age, owners)