He tenido mi primer crack en Core Data y obtengo el siguiente error al ejecutar mi código en mi dispositivo, pero funciona bien en el simulador.
* Finalizando la aplicación debido a la excepción no detectada 'NSInvalidArgumentException', motivo: 'No se puede crear un NSPersistentStoreCoordinator con un modelo nulo'
Algunos de mis métodos que pueden estar causando el 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
Copié y pegué el método managedObjectContext (abajo) de los CoreDataBooks de Apple y ahora funciona ... Aunque no estoy seguro de por qué
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
objective-c
ios
core-data
Dominic Williams
fuente
fuente
NSString *basePath = [paths firstObject];
Respuestas:
Recibí exactamente el mismo mensaje de error que en la publicación original. Estuve luchando con esto durante horas. Era esta línea en mi AppDelegate.m.
Para cualquiera que busque este mensaje de error y encuentre este hilo ... intente esto primero.
Debe asegurarse de que donde dice [lo mismo con el nombre de xcdatamodeld] .... ¡¡¡eso es !!! Por alguna razón, el mío tenía el nombre de mi proyecto allí y no el nombre del modelo de datos.
Lo cambié y funcionó de inmediato .....
Gracias a Rock & Muller por contribuir ... ¡¡me salvasteis días !!
Gaz.
fuente
blah
deblah.xcdatamodeld
. Gracias internet y stackoverflow.primero verificar:
Si obtiene un valor nulo, tal vez el problema esté aquí.
Intenta cambiar @ "momd" por @ "mom"
fuente
modelURL
es que también lo seanil
. La causa más común es un error tipográficoRugbyOnTv
. Tenga en cuenta que esto distingue entre mayúsculas y minúsculas.Experimenté un problema extraño con Xcode 4.3.2 e iOS 5.
devuelve una URL válida pero
devuelve un NSManagedObjectModel nulo. Pero después de verificar la documentación , parece que NSManagedObjectModel necesita un archivo donde NAME_OF_THE_MODEL.momd es un directorio que contiene un archivo NAME_OF_THE_MODEL.mom. Cambiar la URL a
luego funciona. Sin embargo, parece extraño que Xcode genere código que no funciona por sí mismo ...
fuente
Tuve este problema y cambiar "mamás" por "mamá" no hizo nada. Para solucionarlo, tuve que hacer clic con el botón derecho en el archivo xcdatamodelId> mostrar el contenido del paquete y luego eliminar el archivo .xcurrentversion oculto.
PD: Este problema solo comenzó a ocurrir después de que cambié el nombre del archivo del modelo de datos.
fuente
Otra fuente de este error es que a veces Xcode no incluye el modelo de datos en la compilación.
Compruebe las fases de compilación de su destino y asegúrese de que el archivo * .xcdatamodeld esté incluido en la sección Compilar fuentes.
fuente
Lo que probablemente sucedió es que su archivo xcdatamodeld del código fuente de Apple se ha convertido en un archivo xcdatamodel (sin el d) y, por lo tanto, no se consideran iguales.
La forma más rápida de solucionar este problema es seleccionar el archivo xcdatamodel en el navegador de su proyecto y en la barra de menú
Editor->Add Model Version...
y agregue una nueva versión de su modelo. Realice todos los cambios en la nueva versión.
Esto funciona en Xcode 5
fuente
Lo resuelvo agregando el archivo db al archivo
Copy Bundle Resources
.Vaya a la raíz de su proyecto >> seleccione su objetivo >> Fases de construcción >> Copiar recursos del paquete. Asegúrese de que su archivo xcdatamodeld se haya agregado aquí.
Ninguna de las soluciones publicadas funcionó para mí. Entonces, espero que esta publicación ayude a alguien. Mi aplicación solo falla en versiones de lanzamiento por cierto. Lección aprendida. ¡Siempre pruebe las versiones de lanzamiento!
Por cierto, encontré esta publicación SO la más útil https://stackoverflow.com/a/6708837/951349 .
fuente
tengo el mismo problema con @Dominic Williams
intente cambiar el nombre del archivo momd a continuación (puede encontrar esto en el
managedObjectModel
método predeterminado), que es el mismo que el[file name].xcdatamodeld
archivo que creó:fuente
Yo tuve el mismo problema. La solución fue una combinación de 2 respuestas:
1) Tuve que agregar el parámetro "subdirectorio" en la llamada URLForResource
2) Por una razón que no conozco, el modelo de datos no se incluyó cuando se compiló el proyecto. Tuve que agregarlo manualmente en "Fases de compilación / recursos de compilación".
Con solo una de las soluciones anteriores, mi aplicación no funcionó.
fuente
La solución al problema del que habla es sencilla. Cambie la extensión del archivo a "mamá" en lugar de "mamá" en la URL del modelo. Hecho.
fuente
Probé todas las soluciones aquí y ninguna funcionó. Mi problema apareció después de cambiar el nombre del proyecto. Aparentemente, Xcode continúa buscando el archivo momd antiguo en el lugar equivocado durante la compilación.
Para cualquiera que haya probado todas las soluciones anteriores sin éxito, intente verificar la ruta completa de su
.xcdatamodeld
archivo. Eso es lo que funcionó para mí.fuente
Tuve el mismo problema, funcionó bien en iOS6 pero no en iOS5. Así es como lo resolví:
.xcdatamodeld
, abra el menú Editor y haga clic en "Agregar versión del modelo ...").xcdatamodeld
modelo de datos básicos con versiones inferiores).xcdatamodeld
archivo en xcode.xcdatamodeld
archivo en el Finder y seleccione "Mostrar contenido del paquete".xcdatamodel
que no quieres.xcdatamodeld
en xcode(Aquí es donde encontré cómo eliminar una versión de modelo: Cómo eliminar una versión de modelo de datos antigua / no utilizada en Xcode )
fuente
Resuelvo el problema sin cambiar ningún código.
Agrego ModelName.xcdatamodeld a través de Archivo-> Agregar archivo en lugar de arrastrar el archivo al Xcode.
fuente
Por mi parte, el problema era que había cambiado el caso de un par de caracteres en el nombre de la base de datos.
Al iniciar un nuevo proyecto, Xcode configura automáticamente todo desde el nombre del proyecto. Si comenzó llamando a su proyecto "Rugbyontv" y luego decidió cambiar a "RugbyOnTV" e hizo una búsqueda y reemplazo, eso lo rompería. (Crédito a Rob por señalar que el nombre distingue entre mayúsculas y minúsculas)
fuente
He estado buscando una respuesta durante horas y nada funcionó. Pero de repente encontré este artículo . Entonces, de acuerdo con esto, el problema estaba en configurar el controlador raíz en esta parte de AppDelegate.m:
De hecho, debe definir qué controlador raíz delegará su conexión CoreData. Y en mi caso, tenía un TabBarController conectado a otras vistas, por lo que mi controlador raíz de vista dirigida se definió como TabBar y provocó un error. Cambié
a
y todo funcionó.
fuente
Sé que esto no resuelve su problema, pero ayer me encontré con este problema que me atormentó durante horas, la solución que @Dominic Williams publicó me dio una ArrayIndexOutOfBoundsException (cualquiera que sea el equivalente de Objective-C).
Todavía no soy muy bueno con Objective-C / Xcode, pero estoy trabajando en una aplicación para iOS que nuestra empresa desarrolló (en su mayoría) externamente. Desafortunadamente, a menudo olvidaban cómo usar un teclado y usaban letras mayúsculas indistintamente o escribían propiedades incorrectamente, pero eran demasiado perezosos para volver atrás y cambiarlo. Habían usado una letra mayúscula en el nombre del proyecto xcode donde no se suponía que debía estar (el nombre de nuestro producto no usa mayúscula) y tuve que volver atrás y cambiar cada aparición de esta letra mayúscula a minúscula ; que incluía el nombre del proyecto, el archivo de datos centrales, cientos de variables, etc.
De todos modos, una vez que hice esto, encontré este error y ninguna solución me lo solucionó. Me había asegurado de que todos los nombres de URL fueran correctos, el proyecto se limpió, la aplicación se desinstaló, el teléfono se reinició, etc. sin éxito. Me di por vencido, apagué mi Mac y me fui a casa por el día. Para mi sorpresa, regresé esta mañana y ¡todo parecía funcionar bien!
No tengo idea de por qué esto funcionó, pero si está atascado, intente reiniciar su Mac.
fuente
Si alguien se queda atascado por el mismo problema. Asegúrese de haber vinculado correctamente la base de datos (ya que podría haber copiado el código directamente de algún ejemplo).
Simplemente actualice el nombre de la base de datos en los métodos managedObjectModel y persistentStoreCoordinator en AppDelegate.
fuente
Tuve el mismo problema, es decir
devolvió nulo, porque no se generó ningún archivo .momd.
La razón fue que en el directorio de la aplicación (por ejemplo, MyGreatApp / MyGreatApp.app) xcode había copiado MyModel.xcdatamodeld en lugar de generar MyModel.momd desde el archivo MyModel.xcdatamodeld (usando momc).
La solución fue eliminar la referencia a MyModel.xcdatamodeld dentro del navegador del proyecto XCode y arrastrarlo de nuevo al proyecto desde el buscador. Después de eso, xcode se dio cuenta de que necesitaba compilarlo en un .momd.
fuente
Tuve este problema de la nada después de eliminar la aplicación generada en
~/Library/Application Support/iPhone Simulator
. De alguna manera, esto provocó que las compilaciones posteriores fallaran en el simulador y en los dispositivos. No había cambiado nada que ver con CoreData durante años, pero fallaría conCannot create an NSPersistentStoreCoordinator with a nil model
. Probé algunas cosas anteriores y nada funcionó.Pude ver la carpeta momd generada con el archivo mom dentro. La aplicación en el simulador pudo ver ambos, pero no pudo generar el archivo sqlite.
Lo que lo resolvió fue agregar un atributo a una entidad en mi archivo xcdatamodeld en Xcode y luego eliminarlo inmediatamente. Esperaba que esto hiciera que Xcode regenerara lo que estaba causando el problema desde cero y parecía funcionar. Todavía no está claro qué estaba realmente mal, pero mi aplicación se está ejecutando en el simulador y los dispositivos nuevamente ahora.
fuente
Acabo de tener un problema similar al actualizar de IOS5 a IOS6. Resulta que fue un problema sensible a mayúsculas y minúsculas con el nombre del modelo.
No estoy seguro de si esto ayuda a alguien.
fuente
Consulte también este hilo: La prueba unitaria no puede encontrar el archivo de modelo de datos básicos
Me ayudó a resolver el problema, que solo ocurría con Unit-Testing
fuente
De acuerdo, primero diré una solución a medias, funcionará si vuelve a instalar la aplicación (en el simulador o dispositivo depurador). Pero esa no es una solución real con seguridad. Por ejemplo, si está actualizando su aplicación, NO haga eso o su nueva versión puede fallar porque los usuarios no la reinstalarán, usarán el botón de actualización en su lugar.
Como entendí, este problema ocurre principalmente cuando cambia el nombre del archivo del modelo de datos. La razón podría ser la siguiente:
. Cuando ejecuta la aplicación por primera vez, está creando un archivo de modelo de datos en un paquete de aplicaciones como "data_model_1". Esta creación ocurre solo por primera vez.
. Cuando actualice el nombre del archivo y ejecute la aplicación nuevamente, no podrá encontrarlo porque todavía hay un archivo "data_model_1" pero le está diciendo que busque "data_model_2". ¿Cómo puede encontrarlo? Aún no lo ha creado y no lo hará a menos que no instale la aplicación con un nuevo nombre de archivo.
Entonces, si esta es la primera versión de su aplicación y la reinstalación en el simulador o dispositivo no daña su proyecto, hágalo. De lo contrario, consulte la Guía de migración de datos y versiones del modelo de datos principal en la biblioteca de desarrolladores de iOS, tal vez sea lo que necesita.
Editar: si la reinstalación no funciona, intente desinstalar primero, luego limpiar el proyecto, luego cerrar todo, volver a abrir el proyecto y construir + ejecutar. Eso debería funcionar.
fuente
Si su proyecto funciona en el simulador pero no en el dispositivo, intente ejecutar el release-build en su dispositivo en lugar de debug-build.
Seleccione su proyecto -> Producto -> Editar esquema -> Configuración de compilación [DEBUG -> LANZAMIENTO]
Ahora ejecute el proyecto nuevamente, funcionará.
fuente
También estoy enfrentando este problema, pero cuando cambio el
ModelName.xcdatamodeld
archivo, está funcionando. así que creo que elModelName.xcdatamodeld
archivo no se agregó correctamente, así que una vez verifique y limpie la aplicación y ejecútela.fuente
Después de que solucioné el problema del nombre, el error permaneció. Luego funcionó después de reiniciar Xcode 5. Esto podría hacer automáticamente lo mismo que algunas de las sugerencias de enlaces manuales que se ofrecen aquí.
fuente
Para mí, el problema se debió al hecho de que copié y pegué mi modelo de un proyecto de caja de arena en mi proyecto real. Asegúrese siempre de generar su modelo desde dentro del proyecto en el que se está utilizando el modelo.
fuente
Me enfrenté a este mismo error cuando cambió el nombre del
.xcdatamodel
archivo desde Xcode y cambió el nombre renombrado en delegado de la aplicación donde fuera necesario, pero yo todavía tengo el mismo error. Ninguno de los procedimientos sugeridos funcionó para mí.Luego abrí la carpeta
Finder
y encontré un archivo adicional.xccurrentversion
junto con el.xcdatamodel
archivo. Lo abrí en laTextEdit
aplicación y cambié esto:Estoy usando esto con Xcode 6.4, OSX Yosemite 10.10.1
¡Espero que ayude!
fuente