relacionamento - C++ SDK
Nesta página
O Realm não usa tabelas de ponte ou junções explícitas para definir relações como você faria em um banco de dados relacional. O Realm lida com relações por meio de objetos incorporados ou propriedades de referência a outros objetos do Realm. Você lê e grava diretamente nessas propriedades. Isso torna a query de relações tão eficiente quanto a query de qualquer outra propriedade.
Tipos de relacionamento
O Realm oferece suporte a relacionamentos um-para-um, um -para-muitos e inversos . O Realm também fornece um tipo especial de objeto, chamado objeto incorporado, que é conceitualmente semelhante a um relacionamento, mas fornece restrições adicionais.
Relacionamento para um
Um relacionamento entre si significa que um objeto está relacionado a outro objeto. Você define um relacionamento para um Tipo de objeto de Realm em seu modelo de objetos. Especifique uma propriedade onde o tipo é o Tipo de objeto de Realm. Por exemplo, um cão pode ter um relacionamento entre si com um brinquedo favorito.
Relacionamento com muitos
Uma relação de muitos significa que um objeto está relacionado a mais de um outro objeto. No Realm, uma relação entre muitos é uma lista de referências a outros objetos. Por exemplo, uma pessoa pode ter muitos cachorros.
Você pode representar uma relação entre dois tipos de Realm como uma lista, mapa ou um conjunto. Listas, mapas e conjuntos são mutáveis: dentro de uma transação de escrita, você pode adicionar e remover elementos de e para esses tipos de collection. Listas, mapas e conjuntos não estão associados a uma query e são declarados como propriedade do Realm Object Model.
Relacionamento inverso
As definições de relação no Realm são unidirecionais. Uma relação inversa vincula um objeto de volta a um objeto que se refere a ele.
Uma propriedade de relacionamento inversa é um relacionamento de backlink automático. O Realm atualiza automaticamente os relacionamentos implícitos sempre que um objeto é adicionado ou removido em uma lista de muitos ou em uma propriedade de relacionamento de um para um correspondente. Você não pode definir manualmente o valor de uma propriedade de relacionamento inversa.
Declarar propriedades de relacionamento
Definir um relacionamento um-para-um
Um relacionamento entre si mapeia uma propriedade para uma instância única de outro tipo de objeto. Por exemplo, você pode modelar um cão com, no máximo, um brinquedo favorito como um relacionamento para um.
Definir um campo de relacionamento como nulo remove a conexão entre objetos. No entanto, o Realm não exclui o objeto referenciado, a menos que seja um objeto incorporado.
Importante
Relacionamentos um-para-um devem ser opcionais
Quando você declara um relacionamento um-para-um no modelo de objeto, ele deve ser uma propriedade opcional. Se você tentar tornar um relacionamento um-para-um obrigatório, o Realm lançará uma exceção em tempo de execução.
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 um relacionamento para muitos
Um relacionamento para muitos mapeia uma propriedade para zero ou mais instâncias de outro Tipo de objeto de Realm. Por exemplo, você pode modelar uma empresa com qualquer número de funcionários como um relacionamento para-muitos.
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 um relacionamento inverso
Para definir um relacionamento inverso, utilize linking_objects
no seu Realm Object Model. A definição linking_objects
especifica o tipo de objeto e o nome da propriedade do relacionamento que inverte.
Neste exemplo, definimos um Person
tendo um relacionamento entre si com um Dog
. O Dog
tem uma relação inversa com quaisquer objetos Person
através de sua propriedade 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)