Docs Menu
Docs Home
/ /
Datos del modelo

Definir un modelo de objeto de reino - SDK de Kotlin

Esta página describe los tipos de objetos de Realm y cómo definirlos como parte del modelo de datos de su aplicación. Después de definir su modelo de objetos, puede abrir un reino con un esquema que incluya los objetos definidos y trabajar con ellos en él.

El SDK de Kotlin asigna objetos de Realm directamente a objetos nativos de Kotlin, por lo que no es necesario usar una biblioteca de acceso a datos especial. El modelo de datos de la aplicación se define mediante clases Kotlin estándar declaradas en el objeto de código de la aplicación.

Para obtener información sobre cómo realizar cambios en sus objetos Realm después de definir su modelo de objetos Realm, consulte Cambiar un modelo de objeto.

Nota

Definir el modelo de datos con sincronización de dispositivos

Si su aplicación utiliza Atlas Device Sync, hay consideraciones adicionales que debe tener en cuenta al definir su modelo de datos. Para obtener más información, consulte Datos del modelo con Device Sync - SDK de Kotlin.

Losobjetos de reino son instancias con nombres únicos de clases Kotlin con las que puedes trabajar como lo harías con cualquier otra instancia de clase.

Cada clase de objeto representa un tipo de objeto. Los objetos del mismo tipo comparten un esquema de objeto, que define sus propiedades y relaciones. El SDK garantiza que todos los objetos de un dominio se ajusten al esquema de su tipo y valida los objetos al crearlos, modificarlos o eliminarlos.

Sin embargo, tenga en cuenta que los objetos Realm tienen las siguientes restricciones:

  • Los objetos del reino deben heredar del RealmObject Clase o sus subclases: EmbeddedRealmObject AsymmetricRealmObjecto. El SDK de Kotlin no admite la herencia de clases base personalizadas.

  • El SDK de Kotlin requiere que los objetos Realm tengan un constructor vacío. Consulte El ejemplo de solución alternativa se detalla en la siguiente sección.

  • Los nombres de clase están limitados a un máximo de 57 caracteres UTF-8.

Además, el SDK de Kotlin no admite el uso de clases de datos deKotlin. Para modelar datos. Esto se debe a que las clases de datos se suelen usar para datos inmutables, lo cual contradice la forma en que el SDK de Kotlin de Realm modela los datos.

Para definir un nuevo tipo de objeto Realm, debes crear una clase Kotlin con un nombre único que implementar la interfaz RealmObject, EmbeddedRealmObject o AsymmetricRealmObject.

Nota

Los nombres de clase están limitados a un máximo de 57 caracteres UTF-8.

Luego, especifica las propiedades de tu objeto, incluyendo:

  • El tipo de dato para cada propiedad. El Kotlin SDK admite los siguientes tipos de datos:

  • Cualquier anotación de propiedad que añada funcionalidad a las propiedades de los objetos de Realm. Puedes usar anotaciones para:

    • Designar una propiedad como clave principal

    • Marcar una propiedad como indexable

    • Ignorar una propiedad

    • Asignar un nombre de propiedad o clase a otro nombre

  • Cualquier relación con otros objetos de Realm.

Una vez que haya definido su modelo de objeto Realm, puede pasar el conjunto de clases de objeto a la configuración del reino cuando abre un reino y luego trabajar con esos objetos en el reino.

Importante

El reino requiere un constructor vacío

El Realm Kotlin SDK no admite tener un solo constructor primario. El SDK requiere un constructor vacío para crear objetos. Como solución alternativa, puedes hacer algo similar a lo siguiente:

class Person(var name: String, var age: Int): RealmObject {
constructor(): this("", 0) // Empty constructor required by Realm
}

Para definir un tipo de objeto Realm, cree una clase Kotlin que implemente la interfaz RealmObject:

// Implements the `RealmObject` interface
class Frog : RealmObject { // Empty constructor required by Realm
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var age: Int = 0
var species: String? = null
var owner: String? = null
}

Luego puedes usar el objeto como una propiedad para definir relaciones con otros objetos de Realm.

Un EmbeddedRealmObject es un tipo especial de objeto Realm que modela datos complejos sobre un objeto específico. Realm trata cada objeto incrustado como datos anidados dentro de un único objeto principal específico.

Debido a esto, los objetos incrustados tienen las siguientes restricciones:

  • Un objeto incrustado requiere un objeto principal y no puede existir como un objeto de dominio independiente. Si el objeto principal ya no hace referencia al objeto incrustado, este se elimina automáticamente.

  • Un objeto incrustado hereda el ciclo de vida de su objeto principal. Por ejemplo, si se elimina el objeto principal, el objeto incrustado también se elimina.

  • Los objetos incrustados tienen propiedad estricta con su objeto principal.No se puede reasignar un objeto incrustado a un objeto principal diferente ni compartirlo entre varios objetos principales.

  • Los objetos incrustados no pueden tener una llave primaria.

Tip

Si necesita administrar manualmente el ciclo de vida de un objeto referenciado o desea que estos persistan tras la eliminación del objeto principal, utilice un objeto Realm normal con una relación de uno a uno. Para obtener más información, consulte Relaciones - SDK de Kotlin.

Para definir un tipo de objeto incrustado, cree una clase Kotlin que implemente la interfaz 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
}

Los tipos de objetos incrustados son reutilizables y componibles. Puedes usar el mismo tipo de objeto incrustado en varios tipos de objetos principales dentro de otros tipos de objetos incrustados.

Después de definir el tipo de objeto incrustado, debe definir una relación con un objeto principal en su modelo de datos. Para saber cómo hacerlo, consulte Definir un objeto incrustado.

Nuevo en la versión 1.10.0.

Un AsymmetricRealmObject es un objeto de solo inserción diseñado para usarse con la función de sincronización de dispositivos de Atlas: Ingesta de datos. Para obtener información sobre cómo configurar la ingesta de datos con su aplicación, consulte Transmitir datos a Atlas - SDK de Kotlin.

Los objetos asimétricos admiten ampliamente los mismos tipos de propiedades que RealmObject, con algunas excepciones:

  • Los objetos asimétricos solo se pueden usar en dominios sincronizados configurados con Sincronización Flexible. Sin embargo, no se pueden crear suscripciones a objetos asimétricos.

  • Un AsymmetricRealmObject puede contener EmbeddedRealmObject tipos, pero no puede contener RealmObject tipos u otros AsymmetricRealmObject tipos.

  • AsymmetricRealmObject Los tipos no se pueden utilizar como propiedades en otros objetos de Realm.

Además, los objetos asimétricos no funcionan igual que otros objetos de Realm. No se puede agregar, leer, actualizar ni eliminar un objeto asimétrico del reino. Solo se puede crear un objeto asimétrico, que se sincroniza unidireccionalmente con la base de datos Atlas vinculada a la aplicación mediante Device Sync. Realm elimina este objeto después de la sincronización.

Para definir un tipo de objeto asimétrico, cree una clase Kotlin que implemente la interfaz AsymmetricRealmObject:

// Implements the `AsymmetricRealmObject` interface
class WeatherSensor : AsymmetricRealmObject {
@PersistedName("_id")
@PrimaryKey
var id: ObjectId = ObjectId()
var deviceId: String = ""
var temperatureInFarenheit: Float = 0.0F
var barometricPressureInHg: Float = 0.0F
var windSpeedInMph: Int = 0
}

En las versiones 1.11.1 y anteriores del SDK de Kotlin, no se pueden vincular tipos AsymmetricRealmObject a tipos RealmObject. En las versiones 1.12.0 y posteriores del SDK, los tipos AsymmetricRealmObject pueden vincularse a tipos RealmObject, además de a tipos EmbeddedRealmObject.

Una colección es un objeto que contiene cero o más instancias de un tipo de dato compatible. Las colecciones de dominio son homogéneas (todos los objetos de una colección son del mismo tipo) y están respaldadas por sus correspondientes clases integradas de Kotlin. Para obtener más información sobre los tipos de colección utilizados en el SDK de Kotlin y los tipos de datos compatibles, consulte Tipos de colección.

El SDK de Kotlin ofrece varios tipos de colecciones que puedes usar como propiedades en tu modelo de datos: RealmList, RealmSet y RealmDictionary.

Las colecciones también permiten definir relaciones de varios objetos entre objetos de Realm. Consulta Relaciones - SDK de Kotlin para obtener más información.

Importante

Inicializar propiedades de colección

Los tipos de colección no son nulos. Al definir una propiedad de colección,debe inicializarla.

Para definir una propiedad como RealmList, especifique su tipo dentro del esquema del objeto como RealmList<E> e inicialice el valor predeterminado 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 = ""
}

Para definir una propiedad como un RealmSet, especifique su tipo dentro del esquema del objeto como RealmSet<E> e inicialice el valor predeterminado 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 = ""
}

Para definir una propiedad como RealmDictionary, especifique su tipo dentro del esquema del objeto como RealmDictionary<K, V> e inicialice el valor predeterminado 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()
}

Realm no permite el uso de caracteres . o $ en las claves de mapa. Puedes usar la codificación y decodificación porcentual para almacenar una clave de mapa que contenga uno de estos caracteres no permitidos.

// Percent encode . or $ characters to use them in map keys
val mapKey = "Hundred Acre Wood.Northeast"
val encodedMapKey = "Hundred Acre Wood%2ENortheast"

Nuevo en la versión 2.0.0.

A partir de la versión del SDK de Kotlin,2.0.0 se pueden almacenar colecciones de datos mixtos dentro de una RealmAny propiedad. Esta función permite modelar estructuras de datos complejas, como documentos JSON o MongoDB, sin necesidad de definir un modelo de datos estricto.

Los datos no estructurados son aquellos que no se ajustan fácilmente a un esquema esperado, lo que dificulta o hace poco práctico modelarlos para clases de datos individuales. Por ejemplo, su aplicación podría tener datos muy variables o dinámicos cuya estructura se desconoce en tiempo de ejecución.

Almacenar colecciones en una propiedad mixta ofrece flexibilidad sin sacrificar la funcionalidad, incluyendo una sincronización eficiente al usar Device Sync. Además, puede trabajar con ellas de la misma manera que con una colección no mixta:

  • Puedes anidar colecciones mixtas hasta 100 niveles.

  • Puede consultar y reaccionar ante los cambios en colecciones mixtas.

  • Puede buscar y actualizar elementos de colección mixtos individuales.

Sin embargo, almacenar datos en colecciones mixtas tiene menos rendimiento que usar un esquema estructurado o serializar blobs JSON en una única propiedad de cadena.

Para modelar datos no estructurados en tu aplicación, define las propiedades adecuadas en tu esquema como tipos RealmAny. Puedes configurar estas RealmAny propiedades como una colección RealmList o RealmDictionary de RealmAny elementos. Ten en cuenta que RealmAny no puede representar un RealmSet ni un objeto incrustado.

Tip

  • Utilice un mapa de tipos de datos mixtos cuando el tipo sea desconocido pero cada valor tendrá un identificador único.

  • Utilice una lista de tipos de datos mixtos cuando el tipo sea desconocido, pero el orden de los objetos sea importante.

Volver

Datos del modelo

En esta página