Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Relacionamentos e objetos incorporados - React Native SDK

Nesta página

  • Relacionamento individual
  • Relacionamento de um para muitos
  • Relacionamento inverso
  • Definir propriedades de relacionamento inverso
  • Encontre objetos vinculados no código
  • Objetos embarcados
  • Realm Object Models

Uma relação de um para um significa que um objeto está relacionado a, no máximo, um outro objeto de um tipo específico. Para definir uma relação um-para-um, especifique o tipo de propriedade como o tipo de objeto Realm relacionado.

Exemplo

Neste exemplo, um Manufacturer pode fazer um único Car:

class ToOneManufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
car?: Car;
static schema: Realm.ObjectSchema = {
name: 'ToOneManufacturer',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer that may have one Car object
car: 'Car?',
},
};
}
class Car extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'Car',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
},
};
}

Um relacionamento um para muitos significa que um objeto pode estar relacionado a vários objetos. Para definir uma relação para muitos, especifique uma propriedade em que o tipo é uma lista ou matriz do tipo de objeto Realm relacionado em seu esquema de objeto.

Exemplo

Neste exemplo, um Manufacturer pode fazer muitos modelos de Car:

class ToManyManufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<LinkedCar>;
static schema: Realm.ObjectSchema = {
name: 'ToManyManufacturer',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer's related LinkedCar objects
cars: 'LinkedCar[]',
},
};
}
class LinkedCar extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'LinkedCar',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// A car's related ToManyManufacturer objects
manufacturer: {
type: 'linkingObjects',
objectType: 'ToManyManufacturer',
property: 'cars',
},
},
};
}

Um relacionamento inverso vincula um objeto a qualquer outro objeto que se refira a ele em um relacionamento definido como "um" ou "muitos". As definições de relacionamento são unidirecionais por padrão. Você deve definir explicitamente uma propriedade no modelo do objeto como um relacionamento inverso.

Por exemplo, o relacionamento "Fabricante tem muitos carros" não cria automaticamente o relacionamento inverso "O carro pertence ao fabricante". Se você não especificar o relacionamento inverso no modelo de objeto, terá de executar uma query separada para procurar o fabricante que produz um automóvel.

Você pode atribuir um relacionamento inverso para uma propriedade no esquema de objeto utilizando linkingObjects. Isso permite que você acesse o relacionamento inverso como uma propriedade normal.

Uma propriedade linkingObjects vincula backlinks para um relacionamento específico. Você especifica qual relacionamento fazer backlink com o tipo de objeto e o nome da propriedade do relacionamento.

Exemplo

Neste exemplo, a propriedade ManufacturerInverse do objeto cars tem uma relação para muitos com um Realm.List de objetos CarInverse . Contém todos os automóveis que estão ligados ao fabricante.

A propriedade CarInverse do objeto manufacturer inverte este relacionamento. A propriedade manufacturer atualiza automaticamente para referir-se a qualquer objeto ManufacturerInverse que contenha o objeto do veículo na sua propriedade cars.

class ManufacturerInverse extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<CarInverse>;
static schema: Realm.ObjectSchema = {
name: 'ManufacturerInverse',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer's related CarInverse objects
cars: 'CarInverse[]',
},
};
}
class CarInverse extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
manufacturer!: Realm.List<ManufacturerInverse>;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'CarInverse',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// A car's related ManufacturerInverse objects
manufacturer: {
type: 'linkingObjects',
objectType: 'ManufacturerInverse',
property: 'cars',
},
},
};
}

Você pode encontrar todos os objetos vinculados a um determinado objeto chamando o método Realm.Object.linkingObjects() do objeto . Isso é útil para quando você deseja acessar todos os objetos de vinculação para uma relação específica sem adicionar uma propriedade ao esquema de objeto.

Exemplo

Neste exemplo, temos um modelo de objeto LinkedCar que não tem um campo manufacturer com o tipo 'linkingObjects'. Alguém cria vários fabricantes e objetos automotivos, adicionando os carros recém-criados ao campo cars de um fabricante.

Podemos encontrar o fabricante de um carro usando o método linkingObjects(). Este método retorna uma collection de resultados de objetos vinculados ao carro. Neste exemplo, apenas um fabricante fabrica o modelo de carro Sentra, portanto, podemos esperar que esse fabricante se chame Nissan.

Para encontrar o fabricante que fabrica um automóvel específico:

  1. Ligue linkingObjects()

  2. Passe o nome da classe do fabricante e o campo "carros" como parâmetros

const getLinkedManufacturer = (car: LinkedCar): string => {
const manufacturer = car.linkingObjects<ToManyManufacturer>(
'ToManyManufacturer',
'cars',
)[0];
// Returns 'Nissan', as only one manufacturer is linked
// to this car object.
return manufacturer.name;
};

Um objeto embarcado é um tipo especial de objeto de Realm que modela dados complexos a respeito de um objeto específico. Os objetos incorporados são semelhantes às relações, mas fornecem restrições adicionais e mapeiam mais naturalmente o modelo de documentodesnormalizado do MongoDB.

O Realm impõe restrições de propriedade exclusivas que tratam cada objeto embarcado como dados aninhados dentro de um único objeto pai específico. Um objeto incorporado herda o ciclo de vida de seu objeto pai e não pode existir como um objeto Realm independente. Isso significa que os objetos embarcados não podem ter uma chave primária e que o Realm exclui automaticamente os objetos embarcados se o objeto pai for excluído.

Dica

Os tipos de objetos embarcados são reutilizáveis e componíveis

Você pode usar o mesmo tipo de objeto incorporado em vários tipos de objeto pai e pode incorporar objetos dentro de outros objetos incorporados. Você pode até referenciar recursivamente um tipo de objeto incorporado como uma propriedade opcional em sua própria definição.

Observação

O Realm usa exclusões em cascata para objetos embarcados

Quando você exclui um objeto Realm, o Realm exclui automaticamente quaisquer objetos incorporados referenciados por esse objeto. Qualquer objeto que seu aplicativo precise manter após a exclusão de seu objeto pai deve usar relacionamentos .

Para definir um objeto incorporado, defina embedded como true. Você pode fazer referência a um tipo de objeto embarcado a partir de tipos de objetos pai da mesma maneira que define um relacionamento:

class Manufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<CarWithEmbed>;
warranties!: Realm.List<Warranty>;
static schema: Realm.ObjectSchema = {
name: 'Manufacturer',
properties: {
_id: 'objectId',
name: 'string',
cars: 'CarWithEmbed[]',
// Embed an array of objects
warranties: 'Warranty[]',
},
};
}
class CarWithEmbed extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
warranty?: Warranty;
static schema: Realm.ObjectSchema = {
name: 'CarWithEmbed',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// Embed one object
warranty: 'Warranty?',
},
};
}
class Warranty extends Realm.Object {
name!: string;
termLength!: number;
cost!: number;
static schema: Realm.ObjectSchema = {
name: 'Warranty',
embedded: true,
properties: {
name: 'string',
termLength: 'int',
cost: 'int',
},
};
}

Importante

Objetos incorporados não podem ter uma chave primária.

← Definir um modelo de objeto real - React Native SDK