Considerações sobre Migração
August 26, 2025 · View on GitHub
Ao atualizar seu modelo de dados, especialmente para dados persistidos ou sincronizados, você precisa lidar com a compatibilidade retroativa para evitar possíveis problemas ao carregar dados mais antigos. Aqui estão alguns pontos importantes a serem lembrados:
1. Adicionando Campos Não Opcionais
Se você adicionar novos campos não opcionais ao seu modelo, a decodificação de dados antigos (que não conterão esses campos) pode falhar. Para evitar isso:
- Considere dar valores padrão aos novos campos.
- Torne os novos campos opcionais para garantir a compatibilidade com versões mais antigas do seu aplicativo.
Exemplo:
struct Settings: Codable {
var text: String
var isDarkMode: Bool
var newField: String? // Novo campo é opcional
}
2. Mudanças no Formato dos Dados
Se você modificar a estrutura de um modelo (por exemplo, alterando um tipo de Int para String), o processo de decodificação pode falhar ao ler dados mais antigos. Planeje uma migração suave:
- Criando uma lógica de migração para converter formatos de dados antigos para a nova estrutura.
- Usando o inicializador personalizado de
Decodablepara lidar com dados antigos e mapeá-los para o seu novo modelo.
Exemplo:
struct Settings: Codable {
var text: String
var isDarkMode: Bool
var version: Int
// Lógica de decodificação personalizada para versões mais antigas
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.text = try container.decode(String.self, forKey: .text)
self.isDarkMode = try container.decode(Bool.self, forKey: .isDarkMode)
self.version = (try? container.decode(Int.self, forKey: .version)) ?? 1 // Padrão para dados mais antigos
}
}
3. Lidando com Campos Excluídos ou Obsoletos
Se você remover um campo do modelo, certifique-se de que as versões antigas do aplicativo ainda possam decodificar os novos dados sem travar. Você pode:
- Ignorar campos extras ao decodificar.
- Usar decodificadores personalizados para lidar com dados antigos e gerenciar campos obsoletos adequadamente.
4. Versionando Seus Modelos
O versionamento de seus modelos permite que você lide com as mudanças em sua estrutura de dados ao longo do tempo. Ao manter um número de versão como parte de seu modelo, você pode implementar facilmente uma lógica de migração para converter formatos de dados antigos em novos. Essa abordagem garante que seu aplicativo possa lidar com estruturas de dados antigas enquanto transita suavemente para novas versões.
- Por que o Versionamento é Importante: Quando os usuários atualizam seu aplicativo, eles ainda podem ter dados mais antigos persistidos em seus dispositivos. O versionamento ajuda seu aplicativo a reconhecer o formato dos dados e a aplicar a lógica de migração correta.
- Como Usar: Adicione um campo
versionao seu modelo e verifique-o durante o processo de decodificação para determinar se a migração é necessária.
Exemplo:
struct Settings: Codable {
var version: Int
var text: String
var isDarkMode: Bool
// Lidar com a lógica de decodificação específica da versão
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.version = try container.decode(Int.self, forKey: .version)
self.text = try container.decode(String.self, forKey: .text)
self.isDarkMode = try container.decode(Bool.self, forKey: .isDarkMode)
// Se estiver migrando de uma versão mais antiga, aplique as transformações necessárias aqui
if version < 2 {
// Migrar dados mais antigos para o novo formato
}
}
}
- Melhor Prática: Comece com um campo
versiondesde o início. Cada vez que você atualizar a estrutura do seu modelo, incremente a versão e lide com a lógica de migração necessária.
5. Testando a Migração
Sempre teste sua migração completamente, simulando o carregamento de dados antigos com novas versões do seu modelo para garantir que seu aplicativo se comporte como esperado.
Esta tradução foi gerada automaticamente e pode conter erros. Se você é um falante nativo, agradecemos suas contribuições com correções por meio de um Pull Request.