Alterar um modelo de objeto - SDK do Node.js
Nesta página
Versão do esquema
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.
Migrações
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.
Adicionar uma propriedade
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 });
Excluir uma propriedade
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 });
Renomear uma propriedade
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.
Modificar um tipo de propriedade
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(); } } }, });