2010-07-10 6 views
8

Solo intento entrar en las cosas de Core Data y ser interceptado de inmediato. En mi AppDelegate Tengo el siguiente código:- [NSURL initFileURLWithPath:]: parámetro de cadena nulo 'en NSManagedObjectModel

- (NSManagedObjectModel *)managedObjectModel { 

    if (managedObjectModel_ != nil) { 
     return managedObjectModel_; 
    } 
    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"momd"]; 
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
    managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
    return managedObjectModel_; 
} 

Dónde @ "DataModel" es el nombre de mi archivo .xcdatamodel - ¿es esto correcto?

+5

¿Estás seguro de que tu modelo es de tipo mamá y no mamá? (modelo versionado frente a versión no versionada) –

Respuesta

8

A menudo es más fácil de cambiar esto a

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

Entonces, si se trata de una mamá o momd usted seguirá recibiendo el modelo posterior.

+0

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles: nil] retain]; –

12

Cambiar "mamá" a solo "mamá" funcionó para mí. La respuesta de Marcus S. Zarra también trabajó para mí una vez me fijo a la sintaxis:

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

aunque no tengo ni idea de lo que hace esa línea.

Editar: Investigué un poco más y ahora sé lo que hace la línea anterior y por qué funciona/no funciona. La línea anterior buscará en su proyecto todos los modelos y los agregará al modelo xcdata. Esto funciona si no está usando modelos versionados. Sin embargo, si cambia a usar modelos versionados en el futuro, esto importará todas las versiones del modelo, por lo que obtendrá tanto el antiguo como el nuevo juntos, que NO es lo que usted desea. Entonces la solución es hacer una de dos cosas. Si desea utilizar un modelo no versionado usar las siguientes líneas de agarrar el modelo:

NSString *modelPath = [[NSBundle mainBundle] 
    pathForResource:@"DataModel" ofType:@"mom"]; 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

Si desea utilizar un modelo versionado (recomendado) seleccionar el modelo y ejecutar Diseño -> Modelo de datos -> Añadir Versión del modelo de la barra de menú para crear un modelo versionado. Esto cambiará automáticamente la extensión de su modelo de xcdatamodel a xcdatamodeld. Una vez que esto se hace uso de las siguientes líneas:

NSString *modelPath = [[NSBundle mainBundle] 
    pathForResource:@"DataModel" ofType:@"momd"]; 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

en cuenta que la única diferencia es que los cambios de los parámetros de OfType @ "madre" a @ "momd". Espero que esto aclare lo que está pasando para todos los que están tratando de comprender CoreData.D

Cuestiones relacionadas