Definir um modelo de objeto de domínio - SDK Kotlin
Nesta página
Esta página descreve os tipos de Objeto de Realm e como definir objetos de Realm como parte do modelo de dados do seu aplicativo. Depois de definir seu modelo de objetos, você pode abrir um Realm com um esquema que inclua seus objetos definidos e trabalhar com eles no Realm.
A memória do Kotlin SDK mapeia os objetos de Realm diretamente para objetos nativos do Kotlin , portanto, não há necessidade de usar uma biblioteca especial de acesso a dados. Você define o modelo de dados do seu aplicativo por meio de classes Kotlin regulares declaradas no objeto de código do aplicação .
Para saber mais sobre como fazer alterações em seus objetos de Realm depois de definir seu modelo de Objeto de Realm , consulte Alterar um modelo de objeto.
Observação
Definir modelo de dados com Device Sync
Se o seu aplicativo utilizar Atlas Device Sync, há considerações adicionais ao definir seu modelo de dados. Para obter mais informações, consulte Modelar dados com Device Sync - Kotlin SDK.
Objetos reais
Os objetos de Realm são instâncias nomeadas exclusivamente de classes Kotlin com as quais você pode trabalhar como faria com qualquer outra instância de classe .
Cada classe de objeto representa um tipo de objeto. Objetos do mesmo tipo compartilham um esquema de objetos, que define as propriedades e relacionamentos para objetos desse tipo. O SDK 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.
No entanto, observe que os objetos de Realm têm as seguintes restrições:
Objeto de Realm devem herdar da classe
RealmObject
ou de suas subclasses:EmbeddedRealmObject
ouAsymmetricRealmObject
. O Kotlin SDK não suporta herança de classes de base personalizadas.O Kotlin SDK exige que os objetos de Realm tenham um construtor vazio. Consulte oexemplo de solução observado na próxima seção.
Os nomes das classes têm um limite máximo de 57 caracteres UTF-8.
Além disso, o Kotlin SDK não suporta o uso de classes de dados do Kotlin{ para modelar dados. Isso ocorre porque as classes de dados normalmente são usadas para dados imutáveis, o que vai contra a forma como o Realm Kotlin SDK modela os dados.
Definir um novo tipo de objeto
Para definir um novo tipo de objeto , você deve criar uma classe Kotlin nomeada exclusivamente que implemente a interface RealmObject
, EmbeddedRealmObject
ou AsymmetricRealmObject
.
Observação
Os nomes das classes têm um limite máximo de 57 caracteres UTF-8.
Em seguida, você especifica as propriedades do seu objeto, incluindo:
O tipo de dados para cada propriedade. O Kotlin SDK suporta os seguintes tipos de dados:
um subconjunto limitado de BSON tipos
Tipos específicos do domínio, que você pode usar para identificadores exclusivos, registros de data/hora, contadores e coleções
Quaisquer anotações de propriedade, que adicionam funcionalidade às propriedades em seus objetos de Realm . Você pode usar anotações para:
Designar uma propriedade como chave primária
Marcar uma propriedade como indexável
Ignorar uma propriedade
Mapear uma propriedade ou nome de classe para outro nome
Quaisquer relacionamentos com outros objetos do Realm .
Depois de definir seu modelo de Objeto de Realm , você pode passar o conjunto de classes de objeto para a configuração do realm quando abrir um Realm e, em seguida, trabalhar com esses objetos no Realm.
Importante
O Realm exige um construtor vazio
O Realm Kotlin SDK não suporta ter um único construtor principal. O SDK requer um construtor vazio para criar objetos. Como solução alternativa, você pode fazer algo semelhante ao seguinte:
class Person(var name: String, var age: Int): RealmObject { constructor(): this("", 0) // Empty constructor required by Realm }
Definir um tipo de objeto de domínio
Para definir um tipo de objeto de Realm, crie uma Kotlin que implemente a interface RealmObject :
// Implements the `RealmObject` interface class Frog : RealmObject { // Empty constructor required by Realm var _id: ObjectId = ObjectId() var name: String = "" var age: Int = 0 var species: String? = null var owner: String? = null }
Você pode então usar o objeto como uma propriedade para definir relacionamentos com outros objetos do Realm .
Definir um tipo de objeto embarcado
Um EmbeddedRealmObject
é um tipo especial de objeto do Realm que modela dados complexos sobre um objeto específico. O Realm trata cada objeto embarcado como dados aninhados dentro de um único objeto pai específico.
Por isso, os objetos embarcados têm as seguintes restrições:
Um objeto incorporado requer um objeto pai e não pode existir como um objeto de Realm independente. Se o objeto principal não fizer mais referência ao objeto incorporado, o objeto incorporado será automaticamente excluído.
Um objeto incorporado herda o ciclo de vida de seu objeto pai. Por exemplo, se você excluir o objeto principal, o objeto incorporado também será excluído.
Objetos embarcados têm propriedade estrita com seu objeto pai. Não é possível reatribuir um objeto incorporado a outro objeto pai ou compartilhar um objeto incorporado entre vários objetos pai.
Objetos incorporados não podem ter uma chave primária.
Dica
Se você precisar gerenciar manualmente o ciclo de vida de um objeto referenciado ou se quiser que os objetos referenciados persistam após a exclusão do objeto pai, use um Objeto de Realm normal com um relacionamento de um para um. Para obter mais informações, consulte Relacionamentos - Kotlin SDK.
Para definir um tipo de objeto incorporado, crie uma classe Kotlin que implementa a interface EmbeddedRealmObject :
// Implements `EmbeddedRealmObject` interface class EmbeddedAddress : EmbeddedRealmObject { // CANNOT have primary key var street: String? = null var city: String? = null var state: String? = null var postalCode: String? = null var propertyOwner: Contact? = null }
Os tipos de objetos embarcados são reutilizáveis e componíveis. Você pode usar o mesmo tipo de objeto incorporado em vários tipos de objeto pai dentro de outros tipos de objeto incorporado.
Após definir seu tipo de objeto incorporado , você deve definir um relacionamento com um objeto pai em seu modelo de dados. Para saber como, consulte Definir um objeto incorporado.
Definir um tipo de objeto assimétrico
Novidade na versão 1.10.0.
Um AsymmetricRealmObject
é um objeto somente de inserção destinado a ser usado com o recurso Atlas Device Sync de ingestão de dados. Para obter informações sobre como configurar a ingestão de dados com seu aplicação, consulte Transmitir dados para o Atlas - Kotlin SDK.
Objetos assimétricos suportam amplamente os mesmos tipos de propriedade do RealmObject
, com algumas exceções:
Objetos assimétricos só podem ser usados em domínios sincronizados configurados com o Flexible Sync. No entanto, você não pode criar assinaturas para objetos assimétricos.
Um
AsymmetricRealmObject
pode conter tiposEmbeddedRealmObject
, mas não pode conter tiposRealmObject
ou outros tiposAsymmetricRealmObject
.AsymmetricRealmObject
os tipos não podem ser usados como propriedade em outros Objeto de Realm.
Além disso, objetos assimétricos não funcionam da mesma maneira que outros objetos do Realm . Você não pode adicionar, ler, atualizar ou excluir um objeto assimétrico do Realm. Você só pode criar um objeto assimétrico , que é sincronizado unidirecionalmente com o banco de banco de dados do Atlas vinculado ao seu aplicativo com o Device Sync. O Realm exclui esse objeto após a sincronização.
Para definir um Tipo de objeto de Realm assimétrico, crie uma classe Kotlin que implemente a interface AsymmetricRealmObject :
// Implements the `AsymmetricRealmObject` interface class WeatherSensor : AsymmetricRealmObject { var id: ObjectId = ObjectId() var deviceId: String = "" var temperatureInFarenheit: Float = 0.0F var barometricPressureInHg: Float = 0.0F var windSpeedInMph: Int = 0 }
Nas versões 1.11.1 e anteriores do Kotlin SDK , você não pode vincular de AsymmetricRealmObject
tipos a RealmObject
tipos. Nas versões 1.12.0 e posteriores do SDK, os tipos AsymmetricRealmObject
podem ser vinculados a tipos RealmObject
, além dos tipos EmbeddedRealmObject
.
Definir propriedades da coleção
Uma coleção é um objeto que contém zero ou mais instâncias de um tipo de dados suportado. As coleções Realm são homogêneas (todos os objetos em uma coleção são do mesmo tipo) e são apoiadas por suas classes Kotlin incorporadas correspondentes. Para obter mais informações sobre os tipos de coleção usados no Kotlin SDK e seus tipos de dados suportados, consulte Tipos de coleção.
O Kotlin SDK oferece vários tipos de coleção que você pode usar como propriedades em seu modelo de dados: RealmList
, RealmSet
e RealmDictionary
.
As coleções também permitem definir relacionamentos entre objetos de Realm . Consulte Relacionamentos - Kotlin SDK para obter mais informações.
Importante
Inicializar propriedades da collection
Os tipos de coleção não são nulos. Ao definir uma propriedade de collection, você deve inicializá-la.
Definir um RealmList
Para definir uma propriedade como RealmList, especifique seu tipo dentro do esquema de objetos como RealmList<E>
e inicialize o valor padrão usando realmListOf():
// RealmList<E> can be any supported primitive // or BSON type, a RealmObject, or an EmbeddedRealmObject class Frog : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" // List of RealmObject type (CANNOT be nullable) var favoritePonds: RealmList<Pond> = realmListOf() // List of EmbeddedRealmObject type (CANNOT be nullable) var favoriteForests: RealmList<EmbeddedForest> = realmListOf() // List of primitive type (can be nullable) var favoriteWeather: RealmList<String?> = realmListOf() } class Pond : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" }
Definir um RealmSet
Para definir uma propriedade como RealmSet, especifique seu tipo no esquema de objetos como RealmSet<E>
e inicialize o valor padrão usando realmSetOf():
// RealmSet<E> can be any supported primitive or // BSON type or a RealmObject class Frog : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" // Set of RealmObject type (CANNOT be nullable) var favoriteSnacks: RealmSet<Snack> = realmSetOf() // Set of primitive type (can be nullable) var favoriteWeather: RealmSet<String?> = realmSetOf() } class Snack : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" }
Definir um RealmDictionary/RealmMap
Para definir uma propriedade como RealmDictionary, especifique seu tipo no esquema de objetos como RealmDictionary<K, V>
e inicialize o valor padrão usando realmDictionaryOf():
// RealmDictionary<K, V> can be any supported // primitive or BSON types, a RealmObject, or // an EmbeddedRealmObject class Frog : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" // Dictionary of RealmObject type (value MUST be nullable) var favoriteFriendsByPond: RealmDictionary<Frog?> = realmDictionaryOf() // Dictionary of EmbeddedRealmObject type (value MUST be nullable) var favoriteTreesInForest: RealmDictionary<EmbeddedForest?> = realmDictionaryOf() // Dictionary of primitive type (value can be nullable) var favoritePondsByForest: RealmDictionary<String?> = realmDictionaryOf() }
O Realm não permite o uso de .
ou $
caracteres em chaves de mapa. Você pode usar a codificação e a decodificação percentual para armazenar uma chave de mapa que contenha um desses caracteres não permitidos.
// Percent encode . or $ characters to use them in map keys val mapKey = "Hundred Acre Wood.Northeast" val encodedMapKey = "Hundred Acre Wood%2ENortheast"
Definir dados não estruturados
Novidades na versão 2.0.0.
A partir da versão 2.0.0 do Kotlin SDK , você pode armazenar collections de dados mistos dentro de uma propriedade RealmAny
. Você pode usar esse recurso para modelar estruturas de dados complexas, como documentos JSON ou MongoDB , sem precisar definir um modelo de dados rigoroso.
Dados não estruturados são dados que não estão em conformidade com facilmente um esquema esperado, tornando difícil ou impraticável modelar classes de dados individuais. Por exemplo, seu aplicativo pode ter dados altamente variáveis ou dados dinâmicos cuja estrutura é desconhecida no tempo de execução.
O armazenamento de coleções em uma propriedade mista oferece flexibilidade sem sacrificar a funcionalidade, incluindo sincronização de desempenho ao usar o Device Sync. E você pode trabalhar com eles da mesma forma que faria com uma collection não mista:
Você pode aninhar collections mistas em até 100 níveis.
Você pode consultar e React a alterações em coleções mistas.
Você pode localizar e atualizar elementos individuais de coleção mista.
No entanto, armazenar dados em coleções mistas é menos eficiente do que usar um esquema estruturado ou serializar blobs JSON em uma única propriedade de string.
Para modelar dados não estruturados em seu aplicativo, defina as propriedades apropriadas em seu esquema como tipos RealmAny . Você pode então definir essas propriedades RealmAny
como uma coleção RealmList ou RealmDictionary de RealmAny
elementos. Observe que RealmAny
não pode representar um RealmSet
ou um objeto incorporado.
Dica
Use um mapa de tipos de dados mistos quando o tipo for desconhecido, mas cada valor terá um identificador exclusivo.
Use uma lista de tipos de dados mistos quando o tipo for desconhecido, mas a ordem dos objetos for significativa.