Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

Alterar um modelo de objeto - SDK do Node.js

Nesta página

  • Versão do esquema
  • Migrações
  • Adicionar uma propriedade
  • Excluir uma propriedade
  • Renomear uma propriedade
  • Modificar um tipo de propriedade

Uma versão do esquema de esquema de domínio identifica o estado de um esquema de território em algum momento no tempo. Realm controla a versão do esquema de cada realm e usa-o para mapear os objetos em cada realm para o esquema correto.

As versões de esquema são inteiros ascendentes que você pode incluir opcionalmente na configuração do território ao abrir um realm. Se um aplicativo cliente não especificar um número de versão quando abrir um domínio, o domínio assumirá como padrão a versão 0.

Importante

Incrementar versões monotonicamente

As migrações devem atualizar um realm para uma versão superior do esquema. O Realm irá gerar um erro se um aplicativo cliente abrir um realm com uma versão do esquema inferior à versão atual do realm ou se a versão do esquema especificada for igual à versão atual do realm, mas incluir esquemas de objetos diferentes.

Uma migração é uma função que atualiza um domínio e quaisquer objetos que ele contém de uma versão de esquema para uma versão mais nova. As migrações oferecem a flexibilidade de alterar seus esquemas de objetos ao longo do tempo para acomodar novos recursos e refatores.

Dica

Ignorar migração durante o desenvolvimento

Ao desenvolver ou depurar seu aplicativo, talvez você prefira excluir o realm em vez de migrá-lo. Use o sinalizador deleteRealmIfMigrationNeeded para excluir o banco de dados automaticamente quando uma incompatibilidade de esquema exigir uma migração.

Nunca libere um aplicativo para produção com esta sinalização definida como true.

Sempre que você abre um domínio existente com uma versão do esquema maior que a versão atual do domínio, o Realm executa uma função de migração que você define. A função tem acesso ao número da versão do domínio e atualiza os objetos do domínio de forma incremental para que fiquem em conformidade com o novo esquema.

O Realm migra automaticamente certas alterações, como propriedades novas e excluídas, mas não define automaticamente valores para novas propriedades, a menos que o esquema de objeto atualizado especifique um valor padrão. Você pode definir lógica adicional na função de migração para personalizar ainda mais os valores da propriedade.

Observação

Modificar Propriedades do Esquema de um Domínio Sincronizado

A página seguinte demonstra como modificar as propriedades do esquema de um Realm local. Saiba como modificar as propriedades do esquema de um Realm sincronizado.

Para adicionar uma propriedade a um esquema, adicione a nova propriedade à classe do objeto e defina um schemaVersion do objeto de configuração do realm.

Exemplo

Um Realm que utiliza esquema versão 1 tem um tipo de objeto Person com uma propriedade firstName e lastName . O desenvolvedor decide adicionar uma propriedade age à classe Person .

Para migrar o realm para estar em conformidade com o esquema de Person atualizado, o desenvolvedor define a versão do esquema do realm como 2.

const Person = {
name: 'Person',
properties: {
firstName: 'string',
lastName: 'string',
age: 'int'
}
}
const realm = await Realm.open({
schema: [Person],
schemaVersion: 2
});

Para excluir uma propriedade de um esquema, remova a propriedade da classe do objeto e defina um schemaVersion do objeto de configuração do realm. Excluir uma propriedade não afetará os objetos existentes.

Exemplo

Um domínio que utiliza esquema versão 1 tem um tipo de objeto Dog com uma propriedade weight. O desenvolvedor decide remover a propriedade do esquema.

Para migrar o realm para estar em conformidade com o esquema de Dog atualizado, o desenvolvedor define a versão do esquema do realm como 2.

const realm = await Realm.open({
schema: [Dog],
schemaVersion: 2
});

Para renomear uma propriedade de objeto , altere o nome da propriedade no esquema de objetos e, em seguida, abra o Realm com uma versão de esquema incrementada e uma função de migração que atualiza objetos existentes para usar o novo nome de propriedade .

As migrações não permitem renomear diretamente uma propriedade. Em vez disso, você pode criar uma nova propriedade com o nome atualizado, copiar o valor da propriedade antiga e, em seguida, excluir a propriedade antiga.

Exemplo

Um realm que usa a versão do esquema 1 tem um tipo de objeto Person . O esquema original tinha um campo firstName e lastName . Mais tarde, o desenvolvedor decide que a classe Person deve usar um campo fullName combinado e remover os campos firstName e lastName separados.

Para migrar o realm para estar em conformidade com o esquema Person atualizado, o desenvolvedor define a versão do esquema do realm como 2 e define uma função de migração para definir o valor de fullName com base nas propriedades firstName e lastName existentes .

Realm.open({
schema: [Person],
schemaVersion: 2,
onMigration: (oldRealm, newRealm) => {
// only apply this change if upgrading to schemaVersion 2
if (oldRealm.schemaVersion < 2) {
const oldObjects = oldRealm.objects('Person');
const newObjects = newRealm.objects('Person');
// loop through all objects and set the fullName property in the new schema
for (const objectIndex in oldObjects) {
const oldObject = oldObjects[objectIndex];
const newObject = newObjects[objectIndex];
newObject.fullName = `${oldObject.firstName} ${oldObject.lastName}`;
}
}
}
});

Importante

Domínios sincronizados

Os domínios sincronizados oferecem suporte apenas a alterações não separáveis - também chamadas de aditivas - para garantir que os clientes mais antigos possam sincronizar com os clientes mais recentes. Como as renomeações completas exigem que você exclua a propriedade antiga, não é possível renomear uma propriedade sincronizada sem exigir um reinício do cliente. Em vez disso, considere adicionar a propriedade renomeada sem excluir a propriedade antiga. Alternativamente, utilize mapTo para armazenar dados utilizando o nome interno existente, mas permita que seu código utilize um nome diferente.

Para modificar o tipo de propriedade, defina o tipo de propriedade do campo que deseja modificar para o novo tipo de dados. Em seguida, defina um schemaVersion e uma função de chamada de resposta migration do objeto de configuração do realm.

Observação

Os domínios sincronizados somente suportam alterações não interrompidas, para garantir que os clientes mais antigos possam sincronizar com os mais novos. Isso significa que os domínios sincronizados não suportam a modificação do tipo de propriedade de um esquema.

Exemplo

Um Realm que usa a versão do esquema 1 tem um tipo de objeto Dog . O esquema original tinha um _id com um tipo de propriedade de Object ID. Mais tarde, o desenvolvedor decide que o campo Dog da turma _id deve ser do tipo string e atualiza o esquema.

Para migrar o realm para estar em conformidade com o esquema Dog atualizado, o desenvolvedor define a versão do esquema do realm como 2 e define uma função de migração para converter o tipo Object ID em um tipo string .

const realm = await Realm.open({
schema: [Dog],
schemaVersion: 2,
onMigration: (oldRealm, newRealm) => {
if(oldRealm.schemaVersion < 2){
const oldObjects = oldRealm.objects('Dog');
const newObjects = newRealm.objects('Dog');
// loop through all objects and set the _id property in the new schema
for (const objectIndex in oldObjects) {
const oldObject = oldObjects[objectIndex];
const newObject = newObjects[objectIndex];
newObject._id = oldObject._id.toHexString();
}
}
},
});

Voltar

Relacionamentos e objetos incorporados