objective c - que - No se puede crear un NSPersistentStoreCoordinator con un modelo nulo
efecto apple core data (27)
Acabo de tener un problema similar al actualizar de IOS5 a IOS6. Resulta que era un problema sensible a mayúsculas y minúsculas con el nombre del modelo.
No estoy seguro si esto ayuda a alguien.
He tenido mi primer crack en Core Data y recibo el siguiente error al ejecutar mi código en mi dispositivo, pero funciona bien en el simulador.
* Aplicación de finalización debido a la excepción no detectada ''NSInvalidArgumentException'', razón: ''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 (a continuación) de CoreDataBooks de Apple y ahora funciona. No estoy seguro de por qué
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
De acuerdo, primero diré una solución a medias, funcionará si reinstalas la aplicación (en el simulador o en el dispositivo de depuración). Pero esa no es una solución real, sin duda. Por ejemplo, si está actualizando su aplicación, NO haga eso o su nueva versión puede fallar porque los usuarios no la volverán a instalar, sino que usarán el botón de actualización.
Según entendí, este problema ocurre principalmente cuando cambias el nombre del archivo del modelo de datos. La razón podría ser así:
. 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 vuelva a ejecutar la aplicación, 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.
Por lo tanto, 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, vaya por ello. De lo contrario, consulte la Guía de migración de datos y versiones de modelos de datos básicos en la biblioteca para desarrolladores de iOS, tal vez sea lo que necesita.
Editar: si la reinstalación no funciona, intente desinstalar primero, luego limpie el proyecto, luego cierre todo, vuelva a abrir el proyecto y compilación + ejecución. Eso debería funcionar.
Después de que solucioné el problema de nomenclatura, 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 enlace manual que se ofrecen aquí.
He estado buscando una respuesta durante horas y nada funcionó. Pero luego, de repente, encontré este article . De acuerdo con esto, el problema fue establecer el controlador raíz en esta parte de AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
ListViewController *rootView = (ListViewController *)self.window.rootViewController;
rootView.managedObjectContext = self.managedObjectContext;
return YES;
}
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 de raíz tarjeado se definió como TabBar y causó un error. Cambié
ListViewController *rootView = (ListViewController *)self.window.rootViewController;
a
ListViewController *rootView = (ListViewController *)self.window.superview;
y todo funcionó.
He tenido un problema extraño con Xcode 4.3.2 y iOS 5.
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"momd"];
devuelve una URL válida pero
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
devuelve un NSManagedObjectModel nulo. Pero después de verificar la documentation , parece que NSManagedObjectModel necesita un archivo donde NAME_OF_THE_MODEL.momd es un directorio que contiene un NAME_OF_THE_MODEL.mom. Cambiar la URL a
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"mom" subdirectory:@"NAME_OF_THE_MODEL.momd"];
entonces funciona Aunque parece extraño que Xcode genere código que no funciona consigo mismo ...
La solución al problema del que habla es simple. Cambie la extensión de archivo a "mamá" en lugar de "mamá" en la URL modelo. Hecho.
Lo que probablemente sucedió es que su archivo xcdatamodeld del código fuente de Apple se ha convertido en un archivo xcdatamodel (sin el archivo d) y, por lo tanto, no se consideran iguales.
La forma más rápida de solucionar esto es seleccionar el archivo xcdatamodel en el navegador del proyecto y en la barra de menú
Editor->Add Model Version...
y agrega una nueva versión de tu modelo. Realice todos los cambios a la nueva versión.
Esto funciona en Xcode 5
Lo resuelvo agregando el archivo db a Copy Bundle Resources
.
Vaya a la raíz de su proyecto >> seleccione su objetivo >> Fases de compilación >> Copie recursos de paquete. Asegúrese de que su archivo xcdatamodeld haya sido agregado aquí.
Ninguna de las soluciones publicadas funcionó para mí. Entonces, con suerte, esta publicación ayuda a alguien por ahí. Mi aplicación solo se bloquea en versiones de lanzamiento por cierto. Lección aprendida. Siempre prueba construcciones de versiones!
Por cierto, encontré este SO postear el https://.com/a/6708837/951349 más útil.
Me enfrenté a este mismo error cuando .xcdatamodel
el nombre del archivo .xcdatamodel
de xcode y cambié el nombre renombrado en el delegado de la aplicación donde fuera necesario, pero igual recibí el mismo error. Ninguno de los procedimientos sugeridos funcionó para mí.
Luego abrí la carpeta en Finder
y encontré un archivo adicional .xccurrentversion
junto con el archivo .xcdatamodel
. Lo abrí en la aplicación TextEdit
y cambié esto:
<dict>
<key>_XCCurrentVersionName</key>
<string>Your_Renamed_Model_FileName.xcdatamodel</string>
</dict>
Estoy usando esto con Xcode 6.4, OSX Yosemite 10.10.1
¡Espero que ayude!
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.
Para mí, el problema se debió al hecho de que copie pegué mi modelo de un proyecto de recinto de seguridad a mi proyecto real. Siempre asegúrese de generar su modelo desde el proyecto en el que se está utilizando el modelo.
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 comenzar 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)
Primero verificar:
NSLog(@"%@", [self managedObjectModel]);
Si obtienes un valor nulo tal vez el problema esté aquí
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
Por lo tanto, intente cambiar @ "momd" por @ "mom"
Probé todas las soluciones aquí, y ninguna de ellas funcionó. Mi problema apareció después de renombrar el proyecto. Aparentemente, Xcode continúa buscando el archivo old momd en el lugar incorrecto durante la compilación.
Para cualquiera que haya probado todas las soluciones anteriores sin éxito, intente comprobar la ruta completa de su archivo .xcdatamodeld
. Eso es lo que funcionó para mí.
Resuelvo el problema sin cambiar ningún código.
Agrego el ModelName.xcdatamodeld a través de Archivo-> Agregar archivo en lugar de arrastrar el archivo al Xcode.
NSString *path=@"ModelName";
NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"momd"]];
model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Sé que esto no resuelve su problema, pero me encontré con este problema ayer que me atormentó durante horas, la solución @Dominic Williams publicado 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 de iOS que nuestra compañía (en su mayoría) desarrolló externamente. Desafortunadamente, a menudo olvidaban cómo usar un teclado y usaban letras mayúsculas indistintamente o propiedades de hechizo 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 se suponía que no debía estar (nuestro nombre de producto no usa un capital) 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 no había solución para mí. Me había asegurado de que todos los nombres de las URL fueran correctos, se limpiaran los proyectos, se desinstalaran las aplicaciones, se reiniciara el teléfono, etc. sin resultado. Me rendí y apagué mi Mac y me fui a casa por el día. Para mi sorpresa, volví esta mañana y todo parecía funcionar bien.
No tengo idea de por qué funcionó, pero si estás atascado, intenta reiniciar tu Mac.
Si alguien está 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.
Si su proyecto funciona en el simulador pero no en el dispositivo, intente ejecutar el lanzamiento-compilación en su dispositivo en lugar de depurar-compilar.
Seleccione su proyecto -> Producto -> Editar esquema -> Configuración de compilación [DEBUG -> LIBERACIÓN]
Ahora ejecuta el proyecto nuevamente, funcionará.
También estoy enfrentando este problema, pero cuando cambio el archivo ModelName.xcdatamodeld
, está funcionando. así que creo que el archivo ModelName.xcdatamodeld
no se ha agregado correctamente, así que una vez que verifique y limpie la aplicación, ejecútela.
Tenía exactamente el mismo mensaje de error que la publicación original. Estuve luchando con esto por horas. Fue esta línea en mi AppDelegate.m.
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
Para cualquiera que busque este mensaje de error y encuentre este hilo ... intente esto primero.
Debes asegurarte de que dice [lo mismo con el nombre de xcdatamodeld] ... ¡¡que lo es !!! Por algún motivo, el mío tenía mi nombre de proyecto allí y no el nombre del modelo de datos.
Lo cambió y funcionó de inmediato .....
Gracias a Rock & Muller por su contribución ... ¡me salvaste días!
Gaz.
Tengo el mismo problema con @Dominic Williams
intente cambiar el nombre del archivo momd a continuación (puede encontrarlo en el método managedObjectModel
por defecto), que al igual que el [file name].xcdatamodeld
creado:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
Tuve el mismo problema, es decir,
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];
devuelto nil, porque no se generó ningún archivo .momd.
La razón era que en el directorio de la aplicación (por ejemplo, MyGreatApp / MyGreatApp.app) xcode había copiado el MyModel.xcdatamodeld en lugar de generar el MyModel.momd del archivo MyModel.xcdatamodeld (usando momc).
La solución fue eliminar la referencia a MyModel.xcdatamodeld dentro del navegador del proyecto XCode y arrastrarlo al proyecto desde el buscador. Después de eso, xcode se dio cuenta de que necesitaba compilarlo en un .momd.
Tuve el mismo problema, funcionó bien en iOS6 pero no en iOS5. Así es como lo resolví:
- Crea una nueva versión de modelo en xcode. (seleccione el
.xcdatamodeld
, abra el menú Editor y haga clic en "Agregar versión de modelo ...") - Compila y asegúrate de que la nueva versión funcione.
- Establecer el anterior como la versión actual. ("Actual" en el Inspector de archivos para
.xcdatamodeld
en el modelo de datos básicos versionados) - Eliminar la referencia al archivo
.xcdatamodeld
en xcode - Haga clic con el botón derecho en el archivo
.xcdatamodeld
en Finder y seleccione "Mostrar contenido del paquete" - Eliminar el nuevo
.xcdatamodel
que no quieres - Vuelva a agregar el
.xcdatamodeld
en xcode - Compila y sonríe
(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 )
Tuve este problema de la nada después de eliminar la aplicación generada en ~/Library/Application Support/iPhone Simulator
. De alguna manera esto causó 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 con el Cannot create an NSPersistentStoreCoordinator with a nil model
. Intenté algunas cosas arriba y nada funcionó.
Pude ver la carpeta momd generada con el archivo mom dentro. La aplicación en el simulador podía ver ambas 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 de inmediato. Esperaba que esto hiciera que Xcode regenerara lo que estaba causando el problema desde cero y parecía funcionar. Aún no está claro qué fue realmente incorrecto, pero mi aplicación se está ejecutando en el simulador y los dispositivos ahora.
Tuve este problema y cambiar a "mamás" por "mamá" no hizo nada. Para solucionarlo tuve que hacer clic derecho en el archivo xcdatamodelId> mostrar el contenido del paquete y luego eliminar el archivo oculto .xcurrentversion.
PD: Este problema solo comenzó a suceder después de que había cambiado el nombre del archivo del modelo de datos.
Véase también este hilo: Unit Test no puede encontrar el archivo de modelo de Core Data
Me ayudó a resolver el problema, que ocurrió solo con Unit-Testing
Yo tuve el mismo problema. La solución fue una mezcla de 2 respuestas:
1) Tuve que agregar el parámetro "subdirectorio" en la llamada URLForResource
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DATAMODEL_NAME" withExtension:@"mom" subdirectory:@"DATAMODEL_NAME.momd"];
2) Por una razón que no sé, el modelo de datos no se incluyó cuando se compiló el proyecto. Tuve que agregarlo manualmente en "Build Phases / Compile resources".
Con solo una de las soluciones anteriores, mi aplicación no funcionó.