Relationships - Java SDK
Realm allows you to define explicit relationships between the types of objects in an App. A relationship is an object property that references another Realm object rather than one of the primitive data types. You define relationships by setting the type of an object property to another object type in the property schema.
Relationships are direct references to other objects in a realm, which means that you don't need bridge tables or explicit joins to define a relationship like you would in a relational database. Instead you can access related objects by reading and writing to the property that defines the relationship. Realm Database executes read operations lazily as they come in, so querying a relationship is just as performant as reading a regular property.
There are three primary types of relationships between objects:
Key Concepts
You can define relationships, collections, and embedded objects in your object schema using the following types:
RealmObject
RealmList <? extends RealmObject>
Use annotations to indicate whether a given field represents a foreign key relationship or an embedded object relationship. For more information, see Relationship Annotations.
To-One Relationship
A to-one relationship means that an object is related in a specific way to no more than one other object. You define a to-one relationship for an object type in its object schema by specifying a property where the type is the related Realm object type.
Setting a relationship field to null removes the connection between objects, but Realm Database does not delete the referenced object unless that object is embedded.
Tip
See also:
To-Many Relationship
A to-many relationship means that an object is related in a specific
way to multiple objects. You can create a relationship between one object
and any number of objects using a field of type RealmList<T>
where T
is a Realm object in your application:
Tip
See also:
Inverse Relationship
An inverse relationship links an object back to any other objects that refer to it in a defined to-one or to-many relationship. Relationship definitions are unidirectional, so you must explicitly define a property in the object's model as an inverse relationship.
For example, the to-many relationship "User has many Tasks" does not automatically create the inverse relationship "Task belongs to User". If you don't specify the inverse relationship in the object model, you would need to run a separate query to look up the user that is assigned to a given task.
To define an inverse relationship, define a LinkingObjects
property in your
object model. The LinkingObjects
definition specifies the object type and
property name of the relationship that it inverts.
Realm Database automatically updates implicit relationships whenever an object is added or removed in the specified relationship. You cannot manually set the value of an inverse relationship property.
Fields annotated with @LinkingObjects
must be:
marked
final
of type
RealmResults<T>
whereT
is the type at the opposite end of the relationship
Since relationships are many-to-one or many-to-many, following inverse relationships can result in zero, one, or many objects.
Like any other RealmResults
set, you can
query an inverse relationship.