Modelar dados com sincronização de dispositivo - SDK rápido
Nesta página
Realm Object Models
Para definir um Objeto de Realm, derive uma classe doobjeto . Os modelos que você define cada mapa para sua própria coleção no MongoDB Atlas. Neste exemplo, Dog
e Person
mapeariam para separar collections no MongoDB Atlas.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" }
JSON schema
Quando você tem um esquema correspondente no Atlas App Services, o Realm Mobile Sync converte automaticamente os tipos de dados do Realm Swift em BSON à medida que é sincronizado com o Atlas. Quando o dispositivo cliente sincroniza os dados do App Services por meio do Realm Mobile Sync, o SDK converte os BSON de volta para objeto Swift. Se você query esses objeto acessando os dados do MongoDB Atlas diretamente, em vez de usar o Realm Mobile Sync para sincronizar os dados, obterá os tipos de dados BSON. O MongoDB Data Access não é mapeado automaticamente para os equivalentes do objeto Swift.
{ "title": "Dog", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "age": { "bsonType": "long" } } }
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
Realm relacionamento
Relacionamento para um
Usando os objetos no exemplo acima, considere um caso em que um Person
pode ter um Dog
. Podemos adicionar uma propriedade dog
ao nosso modelo Person
que é um link opcional para um objeto Dog
. Relacionamento um-para-um devem ser opcionais.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-one relationship var dog: Dog? }
JSON schema
No esquema do App Services, vemos a nova propriedade ser convertida em um campo dog
. O campo não está na array required
porque é uma propriedade opcional. Seu tipo é um objectId
vinculado a um objeto Dog
específico na collection Dog
separada. O ObjectId é a chave primária do modelo Dog
, portanto, é o campo que vincula os dois objeto.
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "dog": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
O esquema Dog
não muda. Como este é um relacionamento para um, é um relacionamento unidirecional; o Dog
não tem relacionamento com Person
.
Dica
Veja também:
Para obter mais informações sobre relacionamentos um-para-um, consulte: Relacionamento um-para-um.
Relacionamento com muitos
Utilizando os objetos no exemplo acima, considere um caso em que um Person
pode ter muitos cães. Podemos adicionar uma propriedade dogs
ao nosso modelo Person
que é uma lista de objetos Dog
. Se a pessoa não tiver cachorros, esta é uma lista vazia. À medida que a pessoa vai pegando cachorros, podemos criar novos objetos cachorro e anexá-los à lista dogs
da pessoa.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> }
JSON schema
No esquema do App Services, vemos a nova propriedade ser convertida em um campo dogs
. O tipo deste campo é uma matriz, os itens na matriz são do tipo objectId
. Isso ocorre porque definimos a chave primária em nosso modelo Dog
como objectId
. Este campo é uma array das chaves primárias de todos os objetos Dog
relacionados ao objeto Person
.
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "dogs": { "bsonType": "array", "items": { "bsonType": "objectId" } } } }
Dica
Veja também:
Para obter mais informações sobre relacionamentos um-para-muitos, consulte: Relacionamento um-para-muitos.
Relacionamento inverso
Utilizando os objeto no exemplo acima, considere um caso em que o objeto Dog
tem um relacionamento inversa ao objeto Person
.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 // The backlink to the `Person` who has this `Dog`. "dogs") var person: LinkingObjects<Person> (originProperty: } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> }
JSON schema
No esquema do App Services, vemos que a propriedade person
que representa o relacionamento inverso para um Person
do nosso modelo Dog
não está presente. Não é possível definir diretamente o valor de um relacionamento inverso, e esse relacionamento não existe no Atlas. No entanto, o Realm deriva e atualiza esses relacionamentos para você no aplicativo cliente com base em seu modelo de objeto do Realm.
{ "title": "Dog", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "age": { "bsonType": "long" } } }
Dica
Veja também:
Para obter mais informações sobre relacionamentos inversos, consulte: Relacionamento inverso.
Modelos de objetos incorporados
Ao definir um objeto embarcado com o Realm Swift SDK, você deriva uma classe de EmbeddedObject. Você pode referenciar um tipo de objeto incorporado a partir dos tipos de objetos principais da mesma forma que definiria um relacionamento:
class Person: Object { true) var id = 0 (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> // Inverse relationship - a person can be a member of many clubs "members") var clubs: LinkingObjects<DogClub> (originProperty: // Embed a single object. // Embedded object properties must be marked optional. var address: Address? convenience init(name: String, address: Address) { self.init() self.name = name self.address = address } } class DogClub: Object { var name = "" var members: List<Person> // DogClub has an array of regional office addresses. // These are embedded objects. var regionalOfficeAddresses: List<Address> convenience init(name: String, addresses: [Address]) { self.init() self.name = name self.regionalOfficeAddresses.append(objectsIn: addresses) } } class Address: EmbeddedObject { var street: String? var city: String? var country: String? var postalCode: String? }
JSON schema
Objetos incorporados são mapeados para documentos incorporados no esquema do tipo principal. Este comportamento difere dos objetos regulares do Realm, que mapeiam para sua própria coleção MongoDB.
{ "title": "Person", "bsonType": "object", "required": ["id"], "properties": { "id": { "bsonType": "int" }, "name": { "bsonType": "string" }, "dogs": { "bsonType": "array", "items": { "bsonType": "objectId" } }, "address": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } }
{ "title": "DogClub", "bsonType": "object", "required": ["_id", "name", "addresses"], "properties": { "_id": "objectId", "name": { "bsonType": "string" }, "members": { "bsonType": "array", "items": { "bsonType": "objectId" } }, "addresses": { "bsonType": "array", "items": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } } }
Criar modelo de objetos e esquemas de objeto
Para mapear entre modelos de objeto SDK e dados BSON no Atlas, você deve ter um esquema no App Services que corresponda ao seu modelo de objetos SDK. Há algumas maneiras de gerar modelos de esquema e objeto correspondentes:
Crie modelos de objetos no aplicativo cliente e gere esquemas do App Services a partir deles.
Crie esquemas no App Services e gere modelos de objetos do Realm a partir deles.
Se você estiver desenvolvendo um novo aplicativo cliente, provavelmente desejará iterar no modelo de dados no aplicativo cliente. Ative o Modo de desenvolvimento no Atlas App Services para que o backend infira e atualize o esquema com base nos seus modelos de objeto do cliente. O modo de desenvolvimento não funciona com alterações significativas de esquema, portanto, você deve remover o esquema existente do servidor ao fazer alterações significativas no modelo de dados do SDK.
Se você estiver desenvolvendo um aplicação cliente que funcione com dados que já existem no Atlas, poderá gerar um esquema a partir desses dados. Em seguida, você pode gerar modelos de objeto SDK a partir do esquema do lado do servidor.