Estou tendo meu primeiro crack no Core Data e estou recebendo o seguinte erro ao executar meu código no meu dispositivo, mas funciona bem no simulador ..
* Encerrando aplicativo devido à exceção não detectada 'NSInvalidArgumentException', motivo: 'Não é possível criar um NSPersistentStoreCoordinator com um modelo nulo'
Alguns dos meus métodos que podem estar causando o problema:
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created from the application's model.
*/
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil)
{
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"RugbyOnTV.sqlite"];
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
- (NSString *)applicationDocumentsDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}
EDITAR
Copiei e colei o método managedObjectContext (abaixo) dos CoreDataBooks da Apple e agora funciona ... Não tenho certeza do porquê, embora
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
objective-c
ios
core-data
Dominic Williams
fonte
fonte
NSString *basePath = [paths firstObject];
Respostas:
Recebi exatamente a mesma mensagem de erro da postagem original. Fiquei lutando com isso por horas. Foi esta linha no meu AppDelegate.m.
Para qualquer um que esteja pesquisando esta mensagem de erro e encontrando este tópico ... tente isto primeiro.
Você deve ter certeza de que onde diz [mesmo com o nome de xcdatamodeld] .... que está !!! Por algum motivo, o meu tinha o nome do meu projeto e não o nome do modelo de dados.
Alterei e funcionou imediatamente ...
Obrigado a Rock & Muller por contribuir ... você me salvou dias !!
Gaz.
fonte
blah
deblah.xcdatamodeld
. Obrigado internet e stackoverflow.primeiro verifique:
Se você obtiver um valor nulo, talvez o problema esteja aqui
Então, tente mudar @ "momd" por @ "mom"
fonte
modelURL
tambémnil
. A causa mais comum é um erro de digitaçãoRugbyOnTv
. Observe que isso diferencia maiúsculas de minúsculas.Tive um problema estranho com o Xcode 4.3.2 e iOS 5.
retorna um URL válido, mas
retorna um NSManagedObjectModel nulo. Mas depois de verificar a documentação , parece que NSManagedObjectModel precisa de um arquivo onde NAME_OF_THE_MODEL.momd é um diretório que contém um arquivo NAME_OF_THE_MODEL.mom. Alterando o URL para
então funciona. Mas parece estranho que o Xcode gere um código que não funciona sozinho ...
fonte
Eu tive esse problema e mudar "mães" para "mães" não adiantou nada. Para consertar, tive que clicar com o botão direito do mouse no arquivo xcdatamodelId> mostrar o conteúdo do pacote e excluir o arquivo .xcurrentversion oculto.
PS: Esse problema só começou a acontecer depois que alterei o nome do arquivo do modelo de dados.
fonte
Outra fonte desse erro é que às vezes o Xcode não inclui o modelo de dados na construção.
Verifique as fases de construção de seu destino e certifique-se de que o arquivo * .xcdatamodeld esteja incluído na seção Compile Sources.
fonte
O que provavelmente aconteceu é que seu arquivo xcdatamodeld do código-fonte da Apple se transformou em um arquivo xcdatamodelo (sem ad) e, portanto, eles não são considerados iguais.
A maneira mais rápida de corrigir isso é selecionar o arquivo xcdatamodel no navegador do seu projeto e na barra de menu
Editor->Add Model Version...
e adicione uma nova versão do seu modelo. Faça todas as alterações na nova versão.
Isso funciona no Xcode 5
fonte
Eu resolvo isso adicionando o arquivo db ao
Copy Bundle Resources
.Vá para a raiz do seu projeto >> selecione o seu destino >> Construir fases >> Copiar recursos do pacote. Certifique-se de que seu arquivo xcdatamodeld foi adicionado aqui.
Nenhuma das soluções postadas funcionou para mim. Então, espero que este post ajude alguém por aí. Meu aplicativo só trava em compilações de lançamento. Lição aprendida. Sempre teste as compilações de lançamento!
BTW, achei este post de SO o mais útil https://stackoverflow.com/a/6708837/951349 .
fonte
eu tenho o mesmo problema com @Dominic Williams
tente alterar o nome do arquivo momd abaixo (você pode encontrar isso no
managedObjectModel
método padrão), que é igual ao[file name].xcdatamodeld
arquivo que você criou:fonte
Eu tive o mesmo problema. A solução foi uma mistura de 2 respostas:
1) Tive que adicionar o parâmetro "subdiretório" na chamada URLForResource
2) Por um motivo que não sei, o modelo de dados não foi incluído quando o projeto foi compilado. Tive que adicioná-lo manualmente em "Build Phases / Compile resources".
Com apenas uma das soluções acima, meu aplicativo não funcionou.
fonte
A solução para o problema de que você fala é simples. Altere a extensão do arquivo para "mom" em vez de "momd" no URL do modelo. Feito.
fonte
Tentei todas as soluções aqui e nenhuma funcionou. Meu problema apareceu depois de renomear o projeto. Aparentemente, o Xcode continua procurando pelo arquivo momd antigo no lugar errado durante a compilação.
Para qualquer pessoa que tentou todas as soluções acima sem sucesso, tente verificar o caminho completo do seu
.xcdatamodeld
arquivo. Isso é o que funcionou para mim.fonte
Eu tive o mesmo problema, funcionou bem no iOS6, mas não no iOS5. Foi assim que resolvi:
.xcdatamodeld
, abra o menu Editor e clique em "Adicionar versão do modelo ...").xcdatamodeld
Modelo de Dados Principal com Versão).xcdatamodeld
arquivo no xcode.xcdatamodeld
arquivo no Finder e escolha "Mostrar conteúdo do pacote".xcdatamodel
que você não quer.xcdatamodeld
xcode(Aqui é onde descobri como excluir uma versão de modelo: como excluir uma versão de modelo de dados antiga / não usada no Xcode )
fonte
Resolvo o problema sem alterar nenhum código.
Eu adiciono o ModelName.xcdatamodeld através de File-> Add File em vez de arrastar o arquivo para o Xcode.
fonte
Do meu lado, o problema é que eu alterei a capitalização de alguns caracteres no nome do banco de dados.
Ao iniciar um novo projeto, o Xcode configura tudo automaticamente a partir do nome do projeto. Se você começou chamando seu projeto de "Rugbyontv" e depois decidiu mudar para "RugbyOnTV" e fez uma busca e substituição, isso o quebraria. (Agradecemos a Rob por apontar que o nome diferencia maiúsculas de minúsculas)
fonte
Estou procurando uma resposta há horas e nada funcionou. Mas, de repente, encontrei este artigo . Portanto, de acordo com isso, o problema estava em definir o controlador raiz nesta parte do AppDelegate.m:
Na verdade, você deve definir qual controlador raiz delegará sua conexão CoreData. E no meu caso eu tinha um TabBarController conectado a outras visualizações, então meu controlador de raiz de visualização tarada foi definido como TabBar e causou um erro. eu mudei
para
e tudo funcionou.
fonte
Eu sei que isso não resolve o seu problema, mas me deparei com esse problema ontem que me atormentou por horas, a solução que @Dominic Williams postou me deu uma ArrayIndexOutOfBoundsException (qualquer que seja o equivalente Objective-C).
Não sou muito bom com Objective-C / Xcode ainda, mas estou trabalhando em um aplicativo iOS que nossa empresa desenvolveu externamente. Infelizmente, eles muitas vezes esqueciam como usar um teclado e usavam letras maiúsculas alternadamente ou soletravam propriedades incorretamente, mas eram preguiçosos para voltar e alterá-lo. Eles usaram uma letra maiúscula no nome do projeto xcode onde não deveria estar (nosso nome de produto não usa maiúscula) e eu tive que voltar e mudar cada ocorrência desta letra maiúscula para minúscula ; que incluiu o nome do projeto, arquivo de dados principais, centenas de variáveis, etc.
De qualquer forma, depois de fazer isso, encontrei esse erro e nenhuma solução foi consertar para mim. Eu me certifiquei de que todos os nomes de URL estavam corretos, projeto limpo, aplicativo desinstalado, telefone reiniciado, etc, sem sucesso. Desisti e desliguei o meu Mac e foi para casa para o dia. Para minha surpresa, voltei esta manhã e tudo parecia funcionar bem!
Não tenho ideia de por que isso funcionou, mas se você travou, tente reiniciar o Mac.
fonte
Se alguém está preso por causa do mesmo problema. Certifique-se de ter vinculado o banco de dados corretamente (já que você pode ter copiado o código diretamente de algum exemplo).
Basta atualizar o nome do banco de dados nos métodos managedObjectModel e persistentStoreCoordinator no AppDelegate.
fonte
Eu tive o mesmo problema, ou seja
retornou nulo, porque nenhum arquivo .momd foi gerado.
O motivo foi que no diretório do aplicativo (por exemplo, MyGreatApp / MyGreatApp.app), o xcode copiou o MyModel.xcdatamodeld em vez de gerar o MyModel.momd do arquivo MyModel.xcdatamodeld (usando momc).
A solução foi excluir a referência a MyModel.xcdatamodeld dentro do navegador do projeto XCode e arrastá-la de volta para o projeto a partir do localizador. Depois que o xcode percebeu que precisava compilá-lo em um .momd.
fonte
Tive esse problema do nada depois de excluir o aplicativo gerado no
~/Library/Application Support/iPhone Simulator
. De alguma forma, isso fez com que as compilações subsequentes falhassem no simulador e nos dispositivos. Não mudou nada a ver com CoreData por muito tempo, mas iria falhar com oCannot create an NSPersistentStoreCoordinator with a nil model
. Tentei algumas coisas acima e nada funcionou.Pude ver a pasta momd gerada com o arquivo mom dentro. O aplicativo no simulador podia ver ambos, mas falhou ao gerar o arquivo sqlite.
O que resolveu foi adicionar um atributo a uma entidade no meu arquivo xcdatamodeld no Xcode e, em seguida, excluí-lo imediatamente. Eu esperava que isso fizesse o Xcode regenerar tudo o que estava causando o problema do zero e parecia funcionar. Ainda não está claro o que realmente estava errado, mas meu aplicativo está sendo executado no simulador e nos dispositivos novamente agora.
fonte
Acabei de ter um problema semelhante ao atualizar do IOS5 para o IOS6. Acontece que era um problema de distinção entre maiúsculas e minúsculas com o nome do modelo.
Não tenho certeza se isso ajuda alguém.
fonte
Veja também este tópico: O Teste de Unidade não consegue encontrar o arquivo de modelo de Dados Principais
Isso me ajudou a resolver o problema - o que ocorreu apenas com o teste de unidade
fonte
Ok, vou contar uma meia solução primeiro, vai funcionar se você reinstalar o aplicativo (no simulador ou dispositivo de depuração). Mas essa não é uma solução real com certeza. Por exemplo, se você estiver atualizando seu aplicativo, NÃO faça isso ou sua nova versão pode travar porque os usuários não a reinstalarão; em vez disso, eles usarão o botão de atualização.
Pelo que entendi, esse problema ocorre principalmente quando você altera o nome do arquivo do modelo de dados. A razão pode ser assim:
. Quando você executa o aplicativo pela primeira vez, ele está criando um arquivo de modelo de dados no pacote de aplicativos como "data_model_1". Esta criação acontece apenas pela primeira vez.
. Quando você atualiza o nome do arquivo e executa o aplicativo novamente, ele não será capaz de encontrar porque ainda há o arquivo "data_model_1", mas você está dizendo a ele para procurar "data_model_2". Como ele pode encontrar, ele ainda não o criou e não o fará, a menos que você não instale o aplicativo com o novo nome de arquivo.
Portanto, se esta é a primeira versão do seu aplicativo e a reinstalação no simulador ou dispositivo não prejudica o seu projeto, vá em frente. Caso contrário, consulte o Guia de controle de versão e migração de dados do modelo de dados principal na biblioteca de desenvolvedores iOS, talvez seja o que você precisa.
Editar: se a reinstalação não funcionar, tente desinstalar primeiro, depois limpar o projeto, depois fechar tudo, reabrir o projeto e construir + executar. Isso deve funcionar.
fonte
Se o seu projeto funciona no simulador, mas não no dispositivo, tente executar o build de lançamento no seu dispositivo em vez do build de depuração.
Selecione seu projeto -> Produto -> Editar Esquema -> Configuração de Compilação [DEBUG -> RELEASE]
Agora execute o projeto novamente, ele funcionará.
fonte
Também estou enfrentando esse problema, mas quando mudo o
ModelName.xcdatamodeld
arquivo, ele está funcionando. então eu acho que oModelName.xcdatamodeld
arquivo não foi adicionado corretamente, então uma vez verifique e limpe o aplicativo e execute-o.fonte
Depois de corrigir o problema de nomenclatura, o erro permaneceu. Então funcionou depois de reiniciar o Xcode 5. Isso pode fazer automaticamente a mesma coisa que algumas das sugestões manuais de links oferecidas aqui.
fonte
Para mim, o problema foi devido ao fato de que copiei e colei meu modelo de um projeto de sandbox no meu projeto real. Sempre certifique-se de gerar seu modelo de dentro do projeto em que o modelo está sendo usado.
fonte
Eu enfrentei esse mesmo erro quando renomeei o
.xcdatamodel
arquivo de xcode e alterei o nome renomeado no delegado do aplicativo sempre que necessário, mas ainda recebo o mesmo erro. Nenhum dos procedimentos sugeridos funcionou para mim.Em seguida, abri a pasta
Finder
e encontrei um arquivo adicional.xccurrentversion
junto com o.xcdatamodel
arquivo. Eu abri noTextEdit
aplicativo e mudei isso:Estou usando isso com o Xcode 6.4, OSX Yosemite 10.10.1
Espero que ajude!
fonte