Menu Docs

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

Dados do modelo - Swift SDK

Nesta página

  • Tipos e esquemas de objetos
  • Esquema de Realm
  • Herança do modelo
  • Estruturas rápidas
  • Propriedades
  • Visualizar modelos com o Realm
  • Relacionamentos
  • Relacionamento para um
  • Relacionamento com muitos
  • Relacionamento inverso

Os aplicativos Realm modelam os dados como objetos compostos de pares campo-valor, cada um contendo um ou mais tipos de dados suportados.

Os objetos de Realm são classes Swift ou Objective-C comuns, mas também oferecem recursos adicionais, como queries em tempo real. A memória do Swift SDK mapeia os objetos de Realm diretamente para objetos nativos Swift ou Objective-C, o que significa que não há necessidade de usar uma biblioteca especial de acesso a dados, como um ORM. Em vez disso, você pode trabalhar com objetos de Realm como faria com qualquer outra instância de classe.

Cada objeto de Realm está em conformidade com um tipo de objeto específico , que é essencialmente uma classe que define as propriedades e os relacionamentos para objetos desse tipo. O Realm garante que todos os objetos em um realm estejam em conformidade com o esquema do seu tipo de objeto e valida os objetos sempre que eles são criados, modificados ou excluídos.

Exemplo

O esquema a seguir define um tipo de objeto Dog com um nome de string, raça de string opcional, data de nascimento e ID de chave primária.

Um esquema de realm é uma lista de esquemas de objeto válidos que um realm pode conter. Cada Objeto de Realm deve estar em conformidade com um Tipo de objeto de Realm incluído no esquema de seu Realm.

Por padrão, o Swift SDK adiciona automaticamente todas as classes em seu projeto que derivam de RLMObject ou RLMEmbeddedObject ao esquema do realm.

Dica

Configure seu esquema de domínio

Para controlar quais classes o Realm adiciona a um esquema de domínio, consulte Fornecer um subconjunto de classesa um domínio.

Se um domínio já contiver dados quando você abri-lo, o Realm validará cada objeto para garantir que um esquema de objeto tenha sido fornecido para seu tipo e que atenda a todas as restrições especificadas no esquema.

Dica

Saiba como trabalhar com um Realm

Para exemplos de código que mostram como configurar e abrir um domínio no Swift SDK, consulte Configurar e abrir um Realm - Swift SDK.

Você pode subclassificar modelos de Realm para compartilhar comportamentos entre classes, mas há limitações. Em particular, o Realm não permite que você:

  • Converter entre classes polimórficas: subclasse para subclasse, subclasse para principal, principal para subclasse

  • Consulte várias classes simultaneamente: por exemplo, " obtenha todas as instâncias da classe mãe e da subclasse "

  • Contêineres de várias classes: List e Results com uma mistura de principal e subclasse

Dica

Confira as amostras de código para trabalhar em torno dessas limitações.

Novidades na versão 10.10.0: Embora você não possa misturar as declarações de propriedade do @Persisted e @objc dynamic dentro de uma classe, você pode misturar os estilos de notação entre base e subclasses. Por exemplo, uma classe base pode ter uma propriedade @Persisted var foo: Int e uma subclasse pode ter uma propriedade @objc dynamic var bar = 0, com ambas persistentes. No entanto, a propriedade @objc dynamic seria ignorada se a propriedade @Persisted estivesse dentro da mesma base ou subclasse.

O Realm não suporta estruturas Swift como modelos por uma variedade de motivos. O design do Realm se concentra em objetos "vivos". Este conceito não é compatível com estruturas de tipo de valor. Por design, o Realm oferece recursos incompatíveis com essas semânticas, como:

Dito isto, às vezes é útil separar objetos de seu domínio de apoio. Normalmente, isso não é uma decisão de design ideal. Mas os desenvolvedores usam isso como uma solução alternativa para limitações temporárias em nossa biblioteca.

Você pode usar a codificação key-value para inicializar um objeto não gerenciado como uma cópia de um objeto gerenciado. Em seguida, você pode trabalhar com esse objeto não gerenciado como qualquer outro NSObject.

let standaloneModelObject = MyModel(value: persistedModelObject)

Seu modelo de objeto do Realm é uma coleção de propriedades. No nível mais básico, quando você cria seu modelo, suas declarações fornecem informações do Realm sobre cada propriedade:

  • O tipo de dados e se a propriedade é opcional ou obrigatória

  • Se o Realm deve armazenar ou ignorar a propriedade

  • Se a propriedade é uma chave primária ou deve ser indexada

As propriedades também são o mecanismo para estabelecer relacionamentos entre tipos de objeto de Realm.

O Realm Swift SDK usa reflexão para determinar as propriedades em seus modelos no tempo de execução. Seu projeto não deve definir o SWIFT_REFLECTION_METADATA_LEVEL = none. Caso contrário, o Realm não conseguirá descobrir derivados de tipos, como propriedades e casos de enum. A reflexão será habilitada por padrão se o seu projeto não definir um nível específico para esta configuração.

Novidades na versão 10,21,0.

Você pode trabalhar com um subconjunto das propriedades do objeto do Realm criando uma projeção de classe. Uma projeção de classe é uma classe que passa ou transforma algumas ou todas as propriedades do objeto Realm. A projeção de classe permite que você crie modelos de exibição que usam uma abstração de seu modelo de objeto. Isso simplifica o uso e o teste de objeto de Realm em seu aplicativo.

Com a projeção de classe, você pode usar um subconjunto das propriedades do objeto diretamente na interface do usuário ou transformá-los. Quando você usa uma projeção de classe para isso, obtém todos os benefícios dos objetos ativos do Realm:

  • As atualizações ao vivo do objeto projetado pela classe

  • Você pode observá-lo em busca de mudanças

  • Você pode aplicar alterações diretamente às propriedades em transações de escrita

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.

O Realm oferece suporte a relações para-um, para-muitos e inversas.

Um relacionamento entre si significa que um objeto está relacionado a outro objeto. Você define um relacionamento entre si para um tipo de objeto em seu esquema de objeto. Especifique uma propriedade onde o tipo é o tipo de objeto de Realm relacionado. Por exemplo, um cão pode ter um relacionamento entre si com um brinquedo favorito.

Dica

Para saber como definir uma relação para um, consulte Definir uma propriedade de relação para um.

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.

Uma Lista representa a relação para muitos entre dois tipos de Realm. As listas são mutáveis: dentro de uma transação escrita, você pode adicionar e remover elementos de uma lista. As listas não estão associadas a uma query e são geralmente declaradas como propriedade de um modelo de objeto.

Dica

Para saber como definir uma relação para-muitos, consulte Definir uma propriedade de relação para-muitos.

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. Você deve definir explicitamente uma propriedade no modelo do objeto como uma relação inversa. Relações inversas podem se linkar de volta a objetos em uma relação para-um ou para-muitos.

Uma coleção LinkingObjects representa a relação inversa entre dois tipos de Realm. Você não pode adicionar ou remover itens diretamente de uma coleção LinkingObjects.

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.

Por exemplo, considere um rastreador de tarefas com a relação para-muitos "O usuário tem muitas tarefas". Isso não cria automaticamente a relação inversa "A tarefa pertence ao usuário". Para criar a relação inversa, adicione uma propriedade de Usuário na Tarefa que aponta de volta para o proprietário da tarefa. Ao especificar a relação inversa da tarefa para o usuário, você pode executar uma query sobre isso. Se você não especificar a relação inversa, você deverá executar uma consulta separada para procurar o usuário a quem a tarefa é atribuída.

Importante

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 relacionamentos podem ser de muitos para um ou de muitos para muitos. Então, seguir relacionamentos inversos pode resultar em zero, um ou muitos objetos.

Dica

Para saber como definir um relacionamento inversa, consulte Definir uma propriedade de relacionamento inverso.

← Build para tvOS