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.
Objetos del reino
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
RealmObjectClase o sus subclases:EmbeddedRealmObjectAsymmetricRealmObjecto. 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.
Definir un nuevo tipo de objeto
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:
un subconjunto limitado de tipos BSON
Tipos específicos del reino, que puede utilizar para identificadores únicos, marcas de tiempo, contadores y colecciones
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 }
Definir un tipo de objeto de reino
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 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.
Definir un tipo de objeto incrustado
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.
Definir un tipo de objeto asimétrico
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
AsymmetricRealmObjectpuede contenerEmbeddedRealmObjecttipos, pero no puede contenerRealmObjecttipos u otrosAsymmetricRealmObjecttipos.AsymmetricRealmObjectLos 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 { 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.
Definir propiedades de colección
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.
Definir una RealmList
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 = "" }
Defina un RealmSet
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 = "" }
Definir un RealmDictionary/RealmMap
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"
Definir datos no estructurados
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.