Menu Docs
Página inicial do Docs
/ /
Dados do modelo

Tipos suportados - Kotlin SDK

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 .

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.

  • Date ou Instant integrado 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

String

var stringReq: String = ""
var stringOpt: String? = null

Byte

var byteReq: Byte = 0
var byteOpt: Byte? = null

Short

var shortReq: Short = 0
var shortOpt: Short? = null

Int

var intReq: Int = 0
var intOpt: Int? = null

Long

var longReq: Long = 0L
var longOpt: Long? = null

Float

var floatReq: Float = 0.0f
var floatOpt: Float? = null

Double

var doubleReq: Double = 0.0
var doubleOpt: Double? = null

Boolean

var boolReq: Boolean = false
var boolOpt: Boolean? = null

Char

var charReq: Char = 'a'
var charOpt: Char? = null

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
var objectIdReq: ObjectId = ObjectId()
var objectIdOpt: ObjectId? = null

Decimal128

var decimal128Req: Decimal128 = Decimal128("123.456")
var decimal128Opt: Decimal128? = null

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
var uuidReq: RealmUUID = RealmUUID.random()
var uuidOpt: RealmUUID? = null
var realmInstantReq: RealmInstant = RealmInstant.now()
var realmInstantOpt: RealmInstant? = null

N/A

var realmAnyOpt: RealmAny? = RealmAny.create("foo")
var mutableRealmIntReq: MutableRealmInt = MutableRealmInt.create(0)
var mutableRealmIntOpt: MutableRealmInt? = null
var listReq: RealmList<CustomObjectType> = realmListOf()

N/A

var setReq: RealmSet<String> = realmSetOf()

N/A

var dictionaryReq: RealmDictionary<String> = realmDictionaryOf()

N/A

N/A

var realmObjectPropertyOpt: CustomObjectType? = null

N/A

var embeddedProperty: EmbeddedObjectType? = null

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 é 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.

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()

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 de set, increment e decrement não alteram a instância na qual elas são executadas. Em vez disso, eles criam uma nova instância do MutableRealmInt não gerenciada com o valor atualizado.

Saiba como Criar uma propriedade MutableRealmInt (contador) e Atualizar uma propriedade MutableRealmInt (contador).

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)
}
}

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, Long e Short são convertidos internamente em valores int64_t )

  • tipos de BSON suportados

  • RealmList e RealmDictionary collections de dados mistos

  • os 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:

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.

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().

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.

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:

RealmList<E> é um tipo não nulo, onde:

  • listas de elementos RealmObject ou EmbeddedRealmObject não podem ser anuláveis

  • listas de quaisquer outros elementos suportados podem ser anuláveis (RealmList<E?>)

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:

Você não pode usar elementos EmbeddedRealmObject em um RealmSet.

RealmSet<E> é um tipo não nulo, onde:

  • conjuntos de RealmObject elementos não podem ser anuláveis

  • conjuntos de quaisquer outros elementos suportados podem ser anuláveis (RealmSet<E?>)

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:

RealmDictionary<K, V> é um tipo não nulo, onde:

  • as chaves devem ser strings

  • RealmObject ou EmbeddedRealmObject valores deve ser anuláveis (RealmDictionary<K, V?>)

  • qualquer outro valor de elemento suportado pode ser anulável

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.

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 RealmAny

  • nã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.

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:

Para mais informações, consulte Relacionamentos Inversos.

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.

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.

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
}
}

Voltar

Definir um modelo de objeto

Nesta página