Aw caray! Puse algo!

Soy un Núcleo de Datos noob, trabajando en mi primer app de iOS. Después de mucho Pila Desbordante estoy usando este código:

NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
if (!path) {
    path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"mom"];
}
NSAssert(path != nil, @"Unable to find Resource in main bundle");

CoreData es el nombre de mi aplicación.

He tratado de poner en los datos iniciales de la aplicación por encontrar la ruta de acceso al archivo sqlite en mi iPhone simulator, y luego va y la inserción en los que sqlite archivo. Pero en algún momento, he movido el sqlite (pensando que iba a crear una nueva copia), se elimina la aplicación en el simulador, y el sqlite archivo se ha ido. No estoy seguro de si estoy dejando de lado alguna parte del proceso (esto fue hace unas pocas horas), pero el resultado final es que todo está jodido.

¿Cómo puedo resubstantiate este sqlite /momd archivo? «Limpio» y «Limpiar todos los objetivos» están en gris.

Estoy feliz de anunciar el código de mi aplicación que podría ayudar a arrojar algo de luz sobre este problema, pero hay toneladas de código relativas a los Datos de los núcleos que no entiendo, así que no estoy seguro de qué parte post!!! Cualquier ayuda es muy apreciada.

  • Para nadie estancado en este problema por favor tome nota: la momd nombre de la carpeta que dan en la pathForResource es sensible a mayúsculas y minúsculas!

5 Comentarios

  1. 44

    Aquí un par de recomendaciones:

    • El código que has publicado para obtener el .mom(d) archivo no es exactamente de la manera recomendada. Uso mergedModelFromBundles lugar, como en

      self.managedObjectContent= [NSManagedObjectModel mergedModelFromBundles:nil];

      Que se encarga de obtener la ruta de acceso, la elección e integración de la correcta mom o momd, y la inicialización de la MOC todos por un solo paso. Usted debe uso de este. Pero tenga en cuenta que usted necesita para limpiar el proceso de generación de vez en cuando, como se discutió en la este MODO de pregunta/respuesta.

    • Esto muestra que, a pesar de rastreo a través de StackOverflow a menudo es bueno, que no es el mejor enfoque cuando se trata de un gran marco como CoreData.

      Honestamente, tomar un día y leer la documentación desde el inicio hasta el final. Quizás desee google bits de código y para comenzar la codificación de inmediato, pero la lectura a través de la documentación definitivamente ahorra el tiempo de desarrollo considerablemente en el largo plazo.

      También, Marcus Zarra del CoreData libro (ver aquí) me ayudó mucho. Puede parecer caro, pero era totalmente la pena.

    • Sobre un tema diferente, no creo que sea una buena estrategia para poner el pre-cocida sqlite archivo en el simulador del directorio (en el interior de ~/Library/Application Support/iPhone Simulator/), incluso para el desarrollo de propósito… porque no funciona en el dispositivo real. Si necesita hacerlo, poner el archivo sqlite como un recurso de la aplicación, y la copia en el momento del lanzamiento a Documents o Caches, y el uso que después.

    • No creo que se debe decir es «elige» nada y, sin duda, no inicializar un MOC. Todo lo que hace es encontrar todos los modelos en paquetes y los combina. También hay nada de malo con especificar el modelo de dirección URL si usted no necesita combinar varios modelos. Apple explícitamente propone este y la opción de limpieza como soluciones para este problema específico en el CD de la guía de programación.
    • He estado investigando sobre los Datos Básicos y voy a confirmar que Apple, de hecho, dice: initWithContentsOfURL: es el general-técnica preferida. Gracias Yuji para el enlace del libro. Pudo conseguir eso.
    • Si la aplicación está construida con los diferentes equipos que utilizan separado Mamás para distintas partes de la aplicación, que no duda de no desea combinar todos los modelos que se encuentran en las principales paquete para un contexto particular! Van a enredarse innecesariamente. También, Apple Datos Básicos Guía de Programación en «Inicializar el Núcleo de la Pila de Datos» sección de espectáculos de pasar NSURL de NSBundle URLForResource:withExtension: en NSManagedObjectModel initWithContentsOfURL:. Esto puede haber sido una multa de respuesta para el 2010, pero podría ser líder devs por mal camino en 2015.
    • En mi experiencia, a veces de limpieza por sí solo no funciona y tengo que reiniciar Xcode y / o eliminar el contenido de ~/Library/Developer/Xcode/DerivedData
  2. 18

    Si la limpieza de los objetivos de los elementos de menú gris, podría ser que la aplicación está en ejecución.

    La forma en que usted está recibiendo la ruta de acceso a la mamá/momd parece que usted ha intentado integrar CoreData después del hecho (en vez de elegir la han incluido cuando se creó el proyecto). Yo tenía los mismos problemas que usted, probablemente no. El código predeterminado que busca momd supone que existe, y usted debería ser capaz, así, si se agrega una versión de su modelo de datos para el proyecto.

    Para hacerlo, seleccione el archivo xcdatamodel, y en el menú Diseño, seleccione el Modelo de Datos > Añadir la Versión del Modelo. Después, tendrás que CoreData.xcdatamodeld con un subárbol que contiene Coredata.xcdatamodel y una nueva versión. Sólo se puede eliminar la versión adicional y usted tendrá la jerarquía que usted necesita. Si se construye y se mira en el paquete de la Aplicación, verás la CoreData.momd directorio con la mamá en el interior.

    Esos pasos no están incluidas en ninguna de las CoreData tutoriales que he encontrado hasta ahora. Espero que sea útil!

    • Esto funcionó para mí. Yo había añadido CoreData, después del hecho, y era conseguir la «nil modelo de» error porque yo no tengo una mamá(d) en mi generación. Haciendo el «Agregar Versión del Modelo» (+ eliminación de la versión duplicada) hizo el truco!
    • En Xcode 4 de agregar una nueva versión mediante la selección del Editor -> Añadir la Versión del Modelo.
    • Esta es exactamente la pieza que falta en la que he estado buscando para que otros tutoriales no he mencionado! Gracias!
    • Esto me ayudó. Sólo tienen una upvote.
  3. 7

    Respuesta práctica:
    Puede probar el siguiente código si tienes la ruta de los problemas. Usted también querrá comprobar que el archivo xcdatamodel se incluye como un recurso para su destino.

    [[NSBundle bundleForClass:[self class]] pathForResource:@"CoreData" ofType:@"momd"]

    Mejor respuesta: Hay una distinción entre un momd de archivo, que representa el NSManagedObjectModel, y un archivo sqlite, que es utilizado por su NSPersistentStore objeto. El mejor enfoque para trabajar con CoreData es dejar que el SDK de manejar toda la interacción con sqlite. La única cosa que usted necesita para configurar con respecto a sqlite es antes decirle a su NSPersistantStore donde para guardar su archivo sqlite. Los objetos administrados que se define en el modelo de objetos administrados se encargará de todos los datos de inserción y actualizaciones para usted.

    Si usted no está familiarizado con los objetos que me he referido, retirar la manzana docs para una muy útil información general. Usted definitivamente quiere tomar el tiempo para captar el CoreData pila, como la inversión de tiempo va a pagar mucho menos dolores de cabeza si usted trabaja con los Datos principales de la forma en que Apple espera. Es una forma más abstracta del diseño de muchos de los desarrolladores web están acostumbrados, pero tratando de eludir que la abstracción por trabajar directamente con SQLite crea su propio conjunto de complejidad.

    http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-TP1

    • Esto lo hizo por mí, yo había hecho una combinación que, por alguna razón, eliminado el archivo xcdatamodel de la lista de recursos de la copia con la aplicación.
    • Sí, gracias!!! Funciona como un encanto!!!!!!!!!
  4. 4

    Me pareció muy valioso para ir a buscar a mi ejecutable en el simulador «imagen de disco».

    Si la cabeza en ~/Library/Application Support/iPhone Simulator//Aplicaciones, usted puede ver las aplicaciones en el teléfono. Averiguar cuál es el tuyo (el uso de encontrar, o mirar a la fecha) y, a continuación, navegar a su destino.aplicación y buscar el .momd archivo.

    En mi caso, mi momd nombre era diferente de mi .xcdatamodeld nombre de archivo, que fue el motivo de que los datos de los núcleos no podía cargarlo. Una vez que se ha corregido el nombre en el AppDelegate las cosas comenzaron a funcionar correctamente.

    Tenga en cuenta que el momd «archivo» parece ser en realidad un directorio (como la .configuración de la aplicación).

    En términos de agregar el código para inicializar los datos de los núcleos; hice esto también. He creado un nuevo proyecto en blanco con los datos principales de los habilitados, y se copian todos los pasos de inicialización para el centro de datos en el AppDelegate archivo. Hay un montón de cosas relacionadas con la inicialización de la pila completa, por lo que si no está presente, deberá ponerlo ahí.

    • Esta solucionado mi problema. Tuve que copiar+pegar desde los ejemplos, y de lleno en lo que yo pensaba que era la correcta momd nombre de archivo. Resulta que el nombre de archivo diferente que lo que yo pensaba. +1
  5. 1

    Si has añadido una versión de su modelo, el cambio .la mamá .momd

        NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
    if (!path) {
        path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];

Dejar respuesta

Please enter your comment!
Please enter your name here