Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Relacionamentos - Flutter SDK

Nesta página

  • Relacionamento para um
  • Relacionamento com muitos
  • Relacionamento inverso

Você pode referenciar outros modelos do Realm a partir do seu modelo do Realm. Isso permite criar os seguintes tipos de relacionamentos entre objetos de Realm:

Você também pode embarcar um objeto de Realm diretamente em outro para criar uma estrutura de dados aninhada. Objetos embarcados são semelhantes aos relacionamentos, mas fornecem restrições adicionais. Para obter mais informações sobre essas restrições e como criar objetos embarcados, consulte a documentação do tipo de dados Objetos embarcados.

Dica

Query de objetos relacionados

No Flutter v1.9.0 e posterior, você pode usar o getBacklinks() para encontrar objetos vinculados a outro objeto por meio de um relacionamento. Para obter mais informações, consulte Objetos relacionados a queries.

Um relacionamento um-para-um significa que um objeto está relacionado de uma forma específica a não mais do que um outro objeto.

Para estabelecer um relacionamento de um para um, crie uma propriedade em seu modelo cujo tipo seja outro modelo. Vários objetos podem fazer referência ao mesmo objeto.

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.

@RealmModel()
class _Bike {
@PrimaryKey()
late ObjectId id;
late String name;
late _Person? owner;
}
@RealmModel()
class _Person {
@PrimaryKey()
late ObjectId id;
late String firstName;
late String lastName;
late int? age;
}

Uma relação para muitos significa que um objeto está relacionado de uma maneira específica a vários objetos.

Você pode criar um relacionamento entre um objeto e qualquer número de objetos usando uma propriedade do tipo List<T> em seu aplicativo, em que T é uma classe de modelo do Realm.

@RealmModel()
class _Scooter {
@PrimaryKey()
late ObjectId id;
late String name;
late _Person? owner;
}
@RealmModel()
class _ScooterShop {
@PrimaryKey()
late ObjectId id;
late String name;
late List<_Scooter> scooters;
}

Um relacionamento inverso vincula um objeto de Realm de volta a quaisquer outros objetos de Realm que se referem a ele em relacionamentos um-para-um ou um-para-muitos.

Relacionamentos inversos têm as seguintes propriedades:

  • Você deve definir explicitamente uma propriedade no modelo do objeto como um relacionamento inverso. O esquema não pode inferir a relação inversa.

  • Relações inversas se atualizam automaticamente com backlinks correspondentes. Você pode encontrar o mesmo conjunto de objetos Realm com uma query manual, mas o campo de relação inversa reduz o código de query clichê e a capacidade de erro.

  • Você não pode definir manualmente o valor de uma propriedade de relação inversa. Na verdade, o Realm atualiza relações implícitas quando você adiciona ou remove um objeto na relação.

  • Os backlinks funcionam apenas com objetos de Realm. Objetos que ainda não foram adicionados a um domínio ainda não têm backlinks.

Por exemplo, o relacionamento "um usuário tem muitas tarefas" não cria automaticamente o relacionamento inverso "uma tarefa pertence a um usuário". Se você não especificar o relacionamento inverso no modelo de objeto Tarefa, precisará executar uma query separada para procurar o usuário que está atribuído a uma determinada tarefa.

Use o Backlink anotação de propriedade para definir um relacionamento inverso. Passar um símbolo do nome do campo para um ou para muitos para o qual você está criando o backlink como um argumento para Backlink(). Inclua um Iterable do modelo de objeto ao qual você está vinculando novamente no campo abaixo da anotação.

@RealmModel()
class _User {
@PrimaryKey()
late ObjectId id;
late String username;
// One-to-many relationship that the backlink is created for below.
late List<_Task> tasks;
}
@RealmModel()
class _Task {
@PrimaryKey()
late ObjectId id;
late String description;
late bool isComplete;
// Backlink field. Links back to the `tasks` property in the `_User` model.
@Backlink(#tasks)
late Iterable<_User> linkedUser;
}

Observação

Relacionamentos inversos não presentes no esquema de sincronização do dispositivo

Se você estiver usando o Atlas Device Sync, os relacionamentos inversos não estarão presentes no esquema Device Sync no servidor em seu App Services App. Como você não pode definir diretamente o valor de um relacionamento inverso, o relacionamento não existe no esquema Device Sync.

Para obter mais informações sobre o esquema de sincronização de dispositivos no lado do servidor, consulte Configurar e atualizar seu modelo de dados na documentação do Atlas App Services.

← Tipos de dados - Flutter SDK