Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Datos del modelo

Relationships - Kotlin SDK

Esta página describe cómo definir relaciones entre objetos en su modelo de datos. Para obtener más información sobre los objetos Realm y cómo definirlos, consulte Definir un modelo de objetos Realm - SDK de Kotlin.

Unlike a relational database, Realm doesn't use bridge tables or explicit joins to define relationships. Instead, Realm handles relationships through embedded objects or reference properties to other Realm objects. You read from and write to these properties directly. This makes querying relationships as performant as querying against any other property.

Existen dos tipos principales de relaciones entre objetos de Realm:

  • To-One Relationship

  • Relación de muchos

El dominio no limita inherentemente las referencias a objetos de otros objetos dentro del mismo dominio. Esto significa que las relaciones de dominio son implícitamente "muchos a uno" o "muchos a muchos". La única manera de restringir una relación a "uno a uno/uno a muchos" en lugar de "muchos a uno/muchos a muchos" es usar un objeto incrustado, que es un objeto anidado con solo un padre.

Puede definir relaciones en su esquema de objetos definiendo una propiedad de objeto que haga referencia a otro objeto Realm. Obtenga más información sobre el uso de objetos Realm como propiedades.

You can define relationships using the following types:

  • RealmObject

  • RealmList <? extends RealmObject>

  • RealmSet <? extends RealmObject>

También puede incrustar un objeto Realm directamente dentro de otro para crear una estructura de datos anidada con un tipo EmbeddedRealmObject. Sin embargo, los objetos incrustados tienen restricciones adicionales. Consulte la Consulte la sección Defina una sección de objeto incrustado para obtener más información.

A to-one relationship relationship maps one property to a single instance of a RealmObject object type. Nothing prevents multiple parent object instances from referencing the same child instance. If you want to enforce a strict one-to-one relationship, use an embedded object instead.

Nota

Al establecer un campo de relación a uno como null, se elimina la conexión entre los objetos, pero Realm no elimina el objeto referenciado. Si desea eliminar el objeto referenciado al eliminar el objeto principal, utilice un objeto incrustado.

Para definir una relación de uno a uno entre objetos, defina una propiedad de objeto opcional cuyo tipo sea un objeto RealmObject definido en su modelo de datos. Puede ser un tipo de objeto de Realm diferente o el mismo tipo de objeto de Realm:

// Relationships of Realm objects must be of RealmObject type
class Frog : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var age: Int = 0
// Property of RealmObject type (MUST be null)
var favoritePond: Pond? = null
var bestFriend: Frog? = null
}

Una relación de uno a muchos asigna una propiedad a cero o más instancias de un RealmObject tipo de objeto. Nada impide que varias instancias de un objeto padre hagan referencia a la misma instancia hija. Si desea aplicar una relación estricta de uno a muchos, utilice un objeto incrustado.

En Realm, las relaciones de varios elementos son colecciones (una RealmList o un RealmSet) de objetos de Realm. Para obtener más información sobre cómo definir colecciones en el modelo de objetos, consulte Definir propiedades de colección.

Para definir una relación de varios objetos, defina una propiedad de objeto cuyo tipo sea RealmList<E> o RealmSet<E>, donde <E> es un tipo de objeto RealmObject definido en su modelo de datos. Este puede ser un tipo de objeto de Realm diferente o el mismo tipo de objeto de Realm:

// Relationships of RealmList<E> or RealmSet<E> must be of RealmObject type
class Forest : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
// Set of RealmObject type (CANNOT be null)
var frogsThatLiveHere: RealmSet<Frog> = realmSetOf()
// List of RealmObject type (CANNOT be null)
var nearbyPonds: RealmList<Pond> = realmListOf()
}

An inverse relationship is an automatic backlink relationship between a child RealmObject object and any other parent objects that refer to it. Inverse relationships can link back to child objects in a many-to-one or many-to-many relationship. If you want to enforce a strict one-to-one or one-to-many inverse relationship, use an embedded object instead.

Las definiciones de relación son unidireccionales, por lo que debe definir explícitamente una propiedad en el modelo del objeto como una relación inversa. Por ejemplo, la relación a muchos "El usuario tiene muchas publicaciones" no crea automáticamente la relación inversa "La publicación pertenece al usuario". Sin embargo, puede agregar una propiedad de usuario a la publicación que apunte a su propietario. Esto le permite consultar la relación inversa de la publicación al usuario en lugar de ejecutar una consulta independiente para buscar al usuario al que pertenece la publicación. Dado que las relaciones son de muchos a uno o de muchos a muchos, las siguientes relaciones inversas pueden generar cero, uno o muchos objetos.

Nota

Realm actualiza automáticamente las relaciones implícitas cada vez que se añade o elimina un objeto de la relación especificada. No puede añadir ni remover elementos manualmente de una colección de vínculos inversos.

Para definir una relación inversa entre objetos, primero defina una propiedad de colección en el objeto principal cuyo tipo sea RealmList<E>, RealmSet<E> o RealmDictionary<E>, donde <E> es un tipo de objeto RealmObject definido en su modelo de datos. Este puede ser un tipo de objeto Realm diferente o el mismo tipo de objeto Realm:

// Parent object must have RealmList<E>, RealmSet<E>, or
// RealmDictionary<K,V> property of child type
class User : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
// List of child RealmObject type (CANNOT be nullable)
var posts: RealmList<Post> = realmListOf()
// Set of child RealmObject type (CANNOT be nullable)
var favoritePosts: RealmSet<Post> = realmSetOf()
// Dictionary of child RealmObject type (value MUST be nullable)
var postByYear: RealmDictionary<Post?> = realmDictionaryOf()
}

Luego, defina una propiedad inmutable vínculos inversos en el objeto hijo de RealmResults<E>, donde <E> es el tipo de objeto Realm principal:

// Backlink of RealmObject must be RealmResults<E> of parent object type
class Post : RealmObject {
var title: String = ""
var date: RealmInstant = RealmInstant.now()
// Backlink to parent RealmObject type (CANNOT be null & MUST be val)
val user: RealmResults<User> by backlinks(User::posts)
}

An embedded object is a special type of Realm object that you can use to nest data inside of a single, specific parent object. Embedded objects can be in a one-to-one, one-to-many, or inverse relationship similar to the relationships described in the previous sections, except the relationship is restricted to a one-to relationship between a single parent object and an EmbeddedRealmObject type.

Como los objetos incrustados no pueden existir como objetos Realm independientes, hay restricciones adicionales que tener en cuenta:

  • An embedded object has strict ownership by its parent. You cannot share embedded objects between parent objects.

  • El objeto incrustado hereda el ciclo de vida de su elemento principal. Por ejemplo, al eliminar el elemento principal, también se elimina el objeto incrustado.

Los objetos incrustados son útiles cuando existe una clara relación de contención o propiedad. Por ejemplo, un objeto Address podría estar incrustado en un objeto User porque solo tiene sentido en la aplicación dentro del contexto de un usuario.

Tip

Embedded Object Types are Reusable and Composable

Puede utilizar el mismo tipo de objeto incrustado en varios tipos de objetos principales y dentro de otros tipos de objetos incrustados.

Para definir un objeto incrustado con una relación uno a uno con su padre, defina una propiedad de objeto cuyo tipo sea un EmbeddedRealmObject ya definido en su modelo de datos:

// To-one embedded relationships must be of EmbeddedRealmObject type
class Contact : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
// Property of EmbeddedRealmObject type (MUST be null)
var address: EmbeddedAddress? = null
}
class EmbeddedAddress : EmbeddedRealmObject {
var propertyOwner: Contact? = null
var street: String? = ""
// Embed another EmbeddedRealmObject type
var country: EmbeddedCountry? = null
}
class EmbeddedCountry : EmbeddedRealmObject {
var name: String = ""
}

Para definir un objeto incrustado con una relación uno a muchos incrustada con su elemento primario, se debe definir una propiedad de objeto cuyo tipo sea un RealmList<E>, donde <E> es un tipo de objeto Realm EmbeddedRealmObject definido en su modelo de datos:

// To-many embedded relationships must be a RealmList<E> or
// RealmDictionary<K, V> property of EmbeddedRealmObject type
class Business : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
// List of EmbeddedRealmObject type (CANNOT be null)
var addresses: RealmList<EmbeddedAddress> = realmListOf()
// Dictionary of EmbeddedRealmObject type (value MUST be nullable)
var addressByYear: RealmDictionary<EmbeddedAddress?> = realmDictionaryOf()
}

No puedes definir un objeto incrustado con un tipo RealmSet<E>, ya que RealmSet<E> no admite objetos incrustados.

Para definir un objeto incrustado con una relación inversa con su padre, primero defina una propiedad de colección en el objeto padre cuyo tipo sea RealmList<E> o RealmDictionary<E>, donde <E> es un tipo de objeto EmbeddedRealmObject definido en su modelo de datos:

// Parent object must have RealmList<E> or RealmDictionary<K, V>
// property of child EmbeddedRealmObject type
class User : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
// List of child EmbeddedRealmObject type (CANNOT be nullable)
var posts: RealmList<Post> = realmListOf()
// Dictionary of child EmbeddedRealmObject type (value MUST be nullable)
var postByYear: RealmDictionary<Post?> = realmDictionaryOf()
}

No puedes definir un objeto incrustado con un tipo RealmSet<E>, ya que RealmSet<E> no admite objetos incrustados.

Luego, defina una propiedad de vínculos de retroceso inmutables en el objeto secundario cuyo tipo sea el tipo del objeto principal:

// Backlink of EmbeddedRealmObject must be parent object type
class Post : EmbeddedRealmObject {
var title: String = ""
var date: RealmInstant = RealmInstant.now()
// Backlink to parent RealmObject type (CANNOT be null & MUST be val)
val user: User by backlinks(User::posts)
}

Volver

Property Annotations

En esta página