Agora descobri que isso é bastante simples - assim que você souber onde procurar.
Em meu AppDelegate, configurei o NSPersistentStoreCoordinator - e você precisa adicionar algumas opções a isso para instruí-lo a lidar com a migração automática:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}
Então você precisa fazer um pequeno truque no xCode:
- Selecione seu arquivo xcdatamodel
- Selecione o Menu Design no topo - então Modelo de Dados - então escolha Adicionar Versão do Modelo
- Seu arquivo xcdatamodel será movido para um novo diretório com o mesmo nome de seu arquivo xcdatamodel, mas com a extensão xcdatamodeld - haverá um segundo arquivo neste diretório com um 2 no nome. Selecione o novo arquivo e, em seguida, Design-> Modelo de Dados-> Definir Versão Atual ( no Xcode 4 você faz isso )
- Se você já fez as alterações que tornaram seu projeto incompatível, retire essas alterações do arquivo xcdatamodel original. Se você ainda não fez as alterações - então apenas edite o arquivo 2.xcdatamodel (aquele que você acabou de criar na versão atual).
- Agora, quando você instalar esta versão em um dispositivo que tem o modelo antigo, ele fará upgrade automaticamente desse modelo para o novo modelo.
Isso parece ótimo e tão simples quanto eu queria - mas acho que você precisa ter cuidado durante o desenvolvimento ao alterar um modelo - caso contrário, você terá que criar uma nova versão para cada alteração.
Acho que o que farei é manter todos os arquivos alterados e, quando estiver pronto para implantar minha atualização, excluirei todos os arquivos intermediários e apenas implantarei com os modelos mais antigos e mais recentes.
ATUALIZAÇÃO (15/07/2011):
Obrigado a @ rockstarberlin por apontar que há documentação atualizada na apple:
Xcode 4: Definindo a versão atual de um modelo de objeto gerenciado
Atualização: 19/08/2013 melhor link:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html
Isso foi incrivelmente útil. A documentação da Apple estava - como sempre - lamentavelmente incompleta. Recomendo fazer uma compilação limpa, pois encontrei um erro "Não é possível mesclar modelos com duas entidades diferentes xxx" quando executei pela primeira vez depois de fazer essas alterações. A compilação limpa o consertou.
fonte
A resposta de Grouchal é perfeita ... mas se você ainda estiver tendo o "Não é possível mesclar modelos com duas entidades diferentes xxx", mesmo depois de limpar a compilação várias vezes ... Você pode ter problemas com a forma como o managedObjectModel está sendo carregado .. .vai dar uma olhada neste ... o que me ajudou a consertá-lo ..
principais problemas de migração de dados
fonte
Além disso, se você topou com este post, como eu, depois de obter o erro "O modelo usado para abrir a loja é incompatível com o usado para criar a loja" e você está apenas depurando usando o simulador e querendo substituir completamente o Com o modelo antigo instalado, você pode apenas reiniciar o aplicativo Simulador ou excluir seu aplicativo do simulador provavelmente também funcionaria.
Não me ocorreu tentar fazer isso até ler as postagens aqui, quando percebi que havia instalado o aplicativo no simulador e posteriormente alterado o modelo, causando o erro de tempo de execução mencionado acima.
fonte
Para acompanhar a resposta de Santthosh, resolvi postar o trecho de código bem aqui. Você precisa criar seu managedObjectModel com, em
initWithContentsOfURL:
vez de,mergedModelFromBundles:
caso contrário, você receberá o erro:Se o seu arquivo de modelo for denominado "Modelo", veja como você cria o managedObjectModel:
Crédito para esta postagem do blog .
fonte
o menu no Xcode 4 mudou um pouco. aqui está uma descrição de como fazer isso no Xcode 4:
Xcode 4: Definindo a versão atual de um modelo de objeto gerenciado
fonte
Eu tenho esse problema há anos e tentei todas essas respostas sem sucesso. Hoje eu finalmente descobri o que estava fazendo de errado. Problema muito simples, mas esqueci. Ao criar uma versão mais recente do modelo de dados, se estiver ADICIONANDO colunas, certifique-se de marcá-las como OPCIONAIS. Se você não fizer isso, a migração simples não funcionará porque os novos valores da coluna não serão preenchidos.
Assim que me certifiquei de que minhas novas colunas tinham "opcional" marcado, tentei a migração novamente e funcionou.
fonte
Eu tropecei neste post por causa de um problema diferente, mas o erro era " A configuração do modelo usado para abrir a loja é incompatível com o que foi usado para criar a loja. "
Aqui estava meu problema e a solução para ele. No meu modelo, estava usando configurações . Algumas das entidades foram armazenadas em um arquivo e as outras em um segundo arquivo. (Eu tenho alguns padrões que podem precisar ser baixados periodicamente, e seria uma dor incrível mesclá-los no todo). De qualquer forma, criei uma nova entidade. O programa parecia funcionar bem, mas sempre que eu saia, recebia o erro acima.
A solução ali foi olhar minhas configurações, perceber que eu tinha uma entidade que não estava em nenhuma das configurações e adicioná-la a uma. Corre como um sonho.
Isso não resolverá o problema do OP. Mas talvez alguma pessoa frustrada que desembarque aqui via google esteja no barco em que eu estava :)
fonte
iOS 4.0+
fonte
Pequenas edições nas incríveis instruções de @ Grouchal acima para o Xcode versão 5:
Antigo: 2. Selecione o Menu Design no topo - então Modelo de Dados - então escolha Adicionar Versão do Modelo
Versão 5+: 2. Selecione o menu Editor e, em seguida, Adicionar versão do modelo ..., digite o nome da versão e com base no modelo (selecione o modelo original da lista)
fonte