Dados do modelo - Swift SDK
Nesta página
Tipos e esquemas de objetos
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 domínio 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 domínio garante que todos os objetos em um domínio 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.
// A dog has an _id primary key, a string name, an optional // string breed, and a date of birth. @interface Dog : RLMObject @property RLMObjectId *_id; @property NSString *name; @property NSString *breed; @property NSDate *dateOfBirth; @end @implementation Dog + (NSString *)primaryKey { return @"_id"; } + (NSArray<NSString *> *)requiredProperties { return @[ @"_id", @"name", @"dateOfBirth" ]; } @end
// A dog has an _id primary key, a string name, an optional // string breed, and a date of birth. class Dog: Object { true) var _id: ObjectId (primaryKey: var name = "" var breed: String? var dateOfBirth = Date() }
Esquema de Realm
Um esquema de domínio é uma lista de esquemas de objeto válidos que um domínio pode conter. Cada Objeto de domínio deve estar em conformidade com um Tipo de objeto de domínio 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 domínio.
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.
Herança do modelo
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
eResults
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.
Estruturas rápidas
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:
Baixo consumo de memória de dados
Bom desempenho de operação
Falta de serialização/deserialização de dados
Mantendo gráficos de objetos potencialmente complexos sincronizados
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)
Propriedades
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.
Visualizar modelos com o Realm
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
Relacionamentos
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.
Relacionamento para um
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.
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.
Uma Lista representa a relação para muitos entre dois tipos de Realm. As listas são mutáveis: dentro de uma transação de gravação, 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.
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. 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 relacionamento 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.