Esta página descreve os tipos de dados suportados que você pode usar para definir propriedades em seu modelo de objeto. Para obter mais informações sobre como definir seu modelo de objeto, consulte Definir um modelo de objeto.
Para saber como tipos de dados específicos são mapeados para BSON types em um esquema de serviços de aplicativos, consulte Mapeamento de modelo de dados na documentação de Atlas App Services .
Lista de tipos de dados suportados
O Kotlin SDK é compatível com os seguintes tipos de Kotlin, tiposBSON e tipos específicos de Realm, que você pode usar para identificadores exclusivos, carimbos de data/hora, contadores e coleções.
O SDK do Kotlin não oferece suporte nativo:
propriedades de enumeração definidas pelo usuário. Consulte a seção Enums para obter mais informações sobre como usar enums em seus objetos Realm.
DateouInstantintegrado do Kotlin. Consulte a seção RealmInstant para obter mais informações sobre como usar timestamps em seus objetos Realm.
Propriedades de objeto real devem ser mutáveis e inicializadas quando declaradas. Atualmente, o Kotlin SDK não oferece suporte a propriedades abstratas. Você pode declarar propriedades opcionais (anuláveis) usando o operador interno ? Kotlin ou pode atribuir um valor padrão a uma propriedade ao declará-la.
Observação
O Realm armazena todos os tipos numéricos não decimais como valores Long e todos os tipos numéricos decimais como valores Double.
Tipos de dados Kotlin
A tabela a seguir lista os tipos de dados Kotlin com suporte e exemplos de como declará-los como propriedades obrigatórias ou opcionais em seu modelo de objeto.
Tipo de Dados de Kotlin | Obrigatório | Opcional | ||
|---|---|---|---|---|
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | | ||
| | |
Tipos de JSON do MongoDB
A tabela a seguir lista os tipos de dados BSON do MongoDB suportados e exemplos de como declará-los como propriedades obrigatórias ou opcionais em seu modelo de objeto. Para usar esses tipos, você deve importá-los do pacote org.mongodb.kbson.
Tipo de JSON do MongoDB | Obrigatório | Opcional | ||
|---|---|---|---|---|
| | |||
| | |
Tipos específicos do domínio
A tabela a seguir lista os tipos de dados específicos do Realm com suporte e exemplos de como declará-los como propriedades obrigatórias ou opcionais em seu modelo de objeto.
Tipo Específico do domínio | Obrigatório | Opcional | ||
|---|---|---|---|---|
| | |||
| | |||
N/A | | |||
| | |||
| N/A | |||
| N/A | |||
| N/A | |||
N/A | | |||
N/A | |
Unique Identifiers
O Kotlin SDK suporta UUID e ObjectId como identificadores únicos para objetos do Realm.
Observação
Uso de UUID em vez de ObjectId
Em geral, você pode usar UUID para quaisquer campos que funcionem como um identificador único. Usar UUID pode ser particularmente útil se você estiver migrando dados não armazenados no MongoDB, pois é provável que os identificadores exclusivos do seu objeto já sejam do tipo UUID. Por outro lado, usar ObjectId pode ser útil para uma coleção de dados que já existe no MongoDB.
ObjectId
ObjectId é um tipo de BSON específico do MongoDB. É um valor globalmente único de bytes que você pode usar como identificador para objetos. Ele é anulável, indexável e pode ser usado como uma chave primária.
Você pode inicializar um ObjectId utilizando ObjectId().
Importante
io.realm.kotlin.types.ObjectId Deprecated em v1,5,0
No Realm Kotlin SDK versão 1.5.0 e mais recente, io.realm.kotlin.types.ObjectId está obsoleto. Você deve importar ObjectId de org.mongodb.kbson.ObjectId ao invés.
RealmUUID
UUID (Identificador Único Universal) é um valor único de bytes que você pode usar como identificador para objetos. É anulável, indexável e pode ser usado como uma chave primária.
Realm cria UUIDs com o tipo RealmUUID que está em conformidade com RFC 4122 versão 4 e é criado com bytes aleatórios.
Você pode gerar um RealmUUID aleatório utilizando RealmUUID.random() ou passar uma string formatada em UUID para RealmUUID.from():
val uuid1 = RealmUUID.from("46423f1b-ce3e-4a7e-812f-004cf9c42d76") val uuid2 = RealmUUID.random()
MutableRealmInt (Contador)
O Kotlin SDK oferece MutableRealmInt como um tipo inteiro especial que você pode usar como contador lógico para sincronizar com precisão as alterações numéricas em vários clientes distribuídos. Ele se comporta como Long mas também oferece suporte increment aos decrement métodos e que implementam um tipo de dados replicado sem conflitos. Isso garante que as atualizações numéricas possam ser executadas independentemente da ordem de convergência para o mesmo valor.
Uma propriedade MutableRealmInt:
não pode ser usado como uma chave primária
não pode armazenar valores nulos, mas pode ser declarada anulável (
MutableRealmInt?)
Além disso, MutableRealmInt campos:
são apoiados pelos tipos numéricos do Kotlin, portanto, nenhuma migração é necessária ao alterar um campo numérico para
MutableRealmInt.pode usar operadores e funções infixas semelhantes às fornecidas por
Long. No entanto, observe que quaisquer operações diferentes deset,incrementedecrementnão alteram a instância na qual elas são executadas. Em vez disso, eles criam uma nova instância doMutableRealmIntnão gerenciada com o valor atualizado.
Saiba como Criar uma propriedade MutableRealmInt (contador) e Atualizar uma propriedade MutableRealmInt (contador).
RealmInstant (Carimbo de data/hora)
Você não pode armazenar os tipos de Date ou Instant integrados do Kotlin no Realm.
Em vez disso, o SDK do Kotlin usa o tipo RealmInstant para armazenar informações de tempo como um carimbo de data/hora Unix.
Se precisar de dados de carimbo de data/hora em um formato diferente de RealmInstant, você poderá adicionar código de conversão à sua classe de modelo com base no exemplo a seguir:
// model class that stores an Instant (kotlinx-datetime) field as a RealmInstant via a conversion class RealmInstantConversion : RealmObject { private var _timestamp: RealmInstant = RealmInstant.from(0, 0) public var timestamp: Instant get() { return _timestamp.toInstant() } set(value) { _timestamp = value.toRealmInstant() } } fun RealmInstant.toInstant(): Instant { val sec: Long = this.epochSeconds // The value always lies in the range `-999_999_999..999_999_999`. // minus for timestamps before epoch, positive for after val nano: Int = this.nanosecondsOfSecond return if (sec >= 0) { // For positive timestamps, conversion can happen directly Instant.fromEpochSeconds(sec, nano.toLong()) } else { // For negative timestamps, RealmInstant starts from the higher value with negative // nanoseconds, while Instant starts from the lower value with positive nanoseconds // TODO This probably breaks at edge cases like MIN/MAX Instant.fromEpochSeconds(sec - 1, 1_000_000 + nano.toLong()) } } fun Instant.toRealmInstant(): RealmInstant { val sec: Long = this.epochSeconds // The value is always positive and lies in the range `0..999_999_999`. val nano: Int = this.nanosecondsOfSecond return if (sec >= 0) { // For positive timestamps, conversion can happen directly RealmInstant.from(sec, nano) } else { // For negative timestamps, RealmInstant starts from the higher value with negative // nanoseconds, while Instant starts from the lower value with positive nanoseconds // TODO This probably breaks at edge cases like MIN/MAX RealmInstant.from(sec + 1, -1_000_000 + nano) } }
RealmAny (Misto)
Alterado na versão 2.0.0: RealmAny pode conter listas e dicionários de dados mistos.
RealmAny representa um tipo de dados misto não nulo. Ele se comporta como o tipo de valor que contém. RealmAny pode conter:
Tipos de dados de Kotlin suportados (observe que os valores
Byte,Char,Int,LongeShortsão convertidos internamente em valoresint64_t)RealmListeRealmDictionarycollections de dados mistosos seguintes tipos específicos de domínio:
Instante real
RealmUUID
RealmObject (retém uma referência ao objeto, não uma cópia dele)
RealmAny não pode conter EmbeddedRealmObject tipos, RealmSet ou outro RealmAny.
RealmAny propriedades:
são indexáveis , mas não podem ser usados como chave primária
deve ser declarada anulável (
RealmAny?), mas não pode armazenar valores nulospode ser agregado com RealmQuery.max, RealmQuery.min e RealmQuery.sum.
pode ser classificado. Ordem de classificação do maior para o menor:
BooleanByte,Double,Decimal128,Int,Float,Long,Shortbyte[],StringDateObjectIdUUIDRealmObject
Você pode armazenar múltiplas instâncias do RealmAny em campos do RealmList, RealmDictionary ou RealmSet.
Dica
Lidar com polimorfismo com expressões condicionais
Como você precisa conhecer o tipo armazenado para extrair seu valor, recomendamos o uso de uma expressão when para lidar com o tipo RealmAny e sua possível classe de valor interna.
Coleções como mistas
Na versão 2.0.0 e posterior, um tipo de dados RealmAny pode conter collections (uma lista ou dicionário, mas não um conjunto) de elementos RealmAny . Você pode usar collections mistas para modelar dados não estruturados ou variáveis. Para mais informações, consulte Definir Dados Não Estruturados.
Você pode aninhar collections mistas em até 100 níveis.
Você pode consultar propriedades de collections mistas e registrar um ouvinte para alterações, como faria com uma collection normal.
Você pode encontrar e atualizar elementos individuais de collections mistas
Você não pode armazenar conjuntos ou objetos incorporados em coleções mistas.
Para usar collections mistas em seu aplicativo, defina a propriedade de tipo misto em seu modelo de dados da mesma forma que faria com qualquer outro tipo RealmAny . Em seguida, crie a lista ou coleções de dicionário usando RealmAny.create().
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. 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.
Os tipos de coleção não são nulos. Ao definir uma propriedade de coleção, você deve inicializá-la. Para mais informações, consulte Criar uma coleção.
Lista de domínios
O tipo RealmList implementa a interface List do Kotlin. As listas não gerenciadas se comportam como a MutableListde Kotlin.
Um RealmList representa um relacionamento entre muitos contendo:
qualquer um dos tipos de dados de Kotlin suportados
qualquer um dos tipos de JSON suportados
um RealmObject
RealmList<E> é um tipo não nulo, onde:
listas de elementos
RealmObjectouEmbeddedRealmObjectnão podem ser anuláveislistas de quaisquer outros elementos suportados podem ser anuláveis (
RealmList<E?>)
RealmSet
O tipo RealmSet implementa a interface Set do Kotlin. Os conjuntos não gerenciados se comportam como o MutableSetdo Kotlin.
Um RealmSet representa uma relação para muitos contendo valores distintos de:
qualquer um dos tipos de dados de Kotlin suportados
qualquer um dos tipos de JSON suportados
um RealmObject
Você não pode usar elementos EmbeddedRealmObject em um RealmSet.
RealmSet<E> é um tipo não nulo, onde:
conjuntos de
RealmObjectelementos não podem ser anuláveisconjuntos de quaisquer outros elementos suportados podem ser anuláveis (
RealmSet<E?>)
RealmMap/RealmDictionary
O tipo RealmMap implementa a interface Map do Kotlin e é uma array associativa que contém emparelhamentos de String chave-valor com chaves exclusivas. RealmDictionary é um RealmMap especializado que aceita uma chave String e valores não-string. Dicionários não gerenciados se comportam como o LinkedHashMapdo Kotlin.
RealmDictionary os valores podem ser:
qualquer um dos tipos de dados de Kotlin suportados
qualquer um dos tipos de JSON suportados
um RealmObject
RealmDictionary<K, V> é um tipo não nulo, onde:
as chaves devem ser strings
RealmObjectouEmbeddedRealmObjectvalores deve ser anuláveis (RealmDictionary<K, V?>)qualquer outro valor de elemento suportado pode ser anulável
RealmObjetos como Propriedades
Você pode usar RealmObject e quaisquer subclasses, exceto AsymmetricRealmObject como propriedades em seu modelo de objeto.
Importante
AsymmetricRealmObject não pode ser usado como propriedades. Para obter mais informações, consulte Objetos assimétricos.
Objetos reais
Um tipo de RealmObject representa um objeto personalizado que você pode utilizar como uma propriedade.
RealmObject propriedades:
deve ser declarada anulável
pode ser usado como elementos em coleções
pode ser mantido como um valor
RealmAnynão pode ser usado como uma chave primária
Você também pode referenciar um ou mais objetos do Realm de outro por meio de relacionamentos entre um e muitos. Para mais informações, consulte a página Relacionamentos.
Backlinks
Um backlink representa uma relação inversa, entre um RealmObject e um ou mais RealmObject ou entre um RealmObject e um EmbeddedRealmObject. Os backlinks não podem ser nulos.
Implementação de backlinks:
o tipo BacklinksDelegate para
RealmObjectbacklinkso tipo EmbeddedBacklinksDelegate para backlinks do
EmbeddedRealmObject
Para mais informações, consulte Relacionamentos Inversos.
EmbeddedRealmObject
Um EmbeddedRealmObject é um tipo especial de RealmObject.
EmbeddedRealmObject propriedades:
deve ser objetos anuláveis dentro do objeto principal
deve ser valores anuláveis dentro de um dicionário
não pode ser elementos anuláveis dentro de uma lista
não pode ser usado como uma chave primária
pode ser propriedades dentro de um objeto assimétrico
Para obter mais informações, consulte Objetos incorporados.
Tipos geoespaciais
Novidades na versão 1.11.0.
O Kotlin SDK suporta queries geoespaciais utilizando os seguintes tipos de dados:
Importante
Não é possível persistir tipos de dados geoespaciais
Atualmente, os tipos de dados geoespaciais não podem ser persistentes. Por exemplo, você não pode declarar uma propriedade do tipo GeoBox.
Estes tipos podem ser utilizados somente como argumentos para queries geoespaciais.
Para mais informações sobre query com dados geoespaciais, consulte Dados Geoespaciais.
Enumerações
O SDK Kotlin não oferece suporte nativo a enumerações ou enums. Para usar enums em uma classe de objeto de Realm, defina um campo com um tipo que corresponda ao tipo de dados subjacente do seu enum.
Em seguida, crie getters e setters para o campo que convertem o valor do campo entre o valor subjacente e o tipo de enum.
enum class EnumClass(var state: String) { NOT_STARTED("NOT_STARTED"), IN_PROGRESS("IN_PROGRESS"), COMPLETE("COMPLETE") } class EnumObject : RealmObject { var name: String? = null private var state: String = EnumClass.NOT_STARTED.state var stateEnum: EnumClass get() = EnumClass.valueOf(state) set(value) { state = value.state } }