usar tutorial query porque español data ios core-data frameworks nsbundle nsmanagedobjectmodel

ios - tutorial - ¿Cómo usar el ManagedObjectModel de Core Data dentro de un marco?



query core data swift 4 (7)

Intento migrar una parte específica de una de mis aplicaciones a un marco para poder usarla en mi aplicación y en uno de esos sofisticados nuevos widgets de iOS 8. Esta parte es la que maneja todos mis datos en Core Data. Es bastante sencillo mover todo y acceder a él. Solo estoy teniendo problemas para acceder momd archivo de mi momd allí.

Al crear NSManagedObjectModel , intento cargar el momd como se ilustra en las plantillas de código de Apple:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyApp" withExtension:@"momd"]; __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

Desafortunadamente, modelURL permanece nil y, por lo tanto, MyApp bloquea al acceder a la pila de datos centrales con este error:

2014-08-01 22:39:56.885 MyApp[81375:7417914] Cannot create an NSPersistentStoreCoordinator with a nil model 2014-08-01 22:39:56.903 MyApp[81375:7417914] *** Terminating app due to uncaught exception ''NSInvalidArgumentException'', reason: ''Cannot create an NSPersistentStoreCoordinator with a nil model''

Entonces, ¿cuál es la forma correcta de hacerlo cuando se trabaja dentro de un marco con Core Data?


@Ric Santos estaba casi allí. Creo que solo necesitas hacer una extensión "mamá" en lugar de "mamá", y luego se ejecutará.

lazy var managedObjectModel: NSManagedObjectModel = { let modelURL = NSBundle(forClass: self.dynamicType.self).URLForResource(self.dataModelName, withExtension: "mom")! return NSManagedObjectModel(contentsOfURL: modelURL)! }()


El recurso modelo ya no se puede acceder a través de mainBundle , debe usar bundleForClass: así:

NSURL *modelURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"MyApp" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];


Llego un poco tarde al problema de Flohei, pero espero que esto ayude a cualquiera que pase. ¡Es posible hacer que esto funcione sin tener que ejecutar script-fu para copiar recursos!

De forma predeterminada, la plantilla de datos principales de Apple le ofrece algo como esto:

lazy var managedObjectModel: NSManagedObjectModel = { let modelURL = NSBundle.mainBundle().URLForResource("MyCuteCoreDataModel", withExtension: "momd")! return NSManagedObjectModel(contentsOfURL: modelURL)! }()

Eso cargaría sus recursos de datos centrales fuera del paquete principal. La clave aquí es: si el modelo de datos principales se carga en un marco, el archivo .momd está en el paquete de ese marco . Entonces, en cambio, solo hacemos esto:

lazy var managedObjectModel: NSManagedObjectModel = { let sexyFrameworkBundleIdentifier = "com.heybaby.xxx" let customKitBundle = NSBundle(identifier: sexyFrameworkBundleIdentifier)! let modelURL = customKitBundle.URLForResource("MyCuteCoreDataModel", withExtension: "momd")! return NSManagedObjectModel(contentsOfURL: modelURL)! }()

Eso debería ponerte en marcha.

Crédito: https://www.andrewcbancroft.com/2015/08/25/sharing-a-core-data-model-with-a-swift-framework/


Necesita arrastrar el archivo xcdatamodeld y soltarlo en las Fases de compilación | Compilar fuentes para los objetivos que usan el marco. Luego, cuando el objetivo se ejecute, su [NSBundle mainBundle] contendrá el modelo (archivo momd).


Puede que llegue un poco tarde respondiendo esto, pero esto es lo que resolvió mi problema:

Con mi framework estoy entregando también un paquete con recursos como imágenes y otras cosas. Poner el archivo xcdatamodeld allí no dio nada, ya que este archivo se compila con el proyecto y, como resultado, obtienes una carpeta momd en tu paquete de aplicaciones (que en realidad falta en nuestro caso). He creado otro objetivo, no un marco, pero la aplicación, la compilé y copié el momd de su paquete de aplicaciones en mi paquete separado en el proyecto (el que va con framework). Después de hacer esto, solo necesita cambiar su url de recursos del paquete principal al nuevo:

// ... NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"separate_bundle" ofType:@"bundle"]; NSURL *modelURL = [[NSBundle bundleWithPath:bundlePath] URLForResource:@"your_model" withExtension:@"momd"]; // ...

Funcionó bien para mí Lo único que sé es la App Store Review, que aún no he podido ver. Entonces, si ha encontrado una mejor solución, por favor comparta.

EDITAR

Encontré una mejor solución. Puedes construir el modelo tú mismo. De la guía de programación de datos básicos :

Un modelo de datos es un recurso de implementación. Además de los detalles de las entidades y propiedades en el modelo, un modelo que cree en Xcode contiene información sobre el diagrama: su diseño, los colores de los elementos, etc. Esta última información no es necesaria en tiempo de ejecución. El archivo de modelo se compila utilizando el compilador del modelo, momc, para eliminar la información extraña y hacer que la carga del recurso en tiempo de ejecución sea lo más eficiente posible. Un directorio xcdatamodeld "fuente" se compila en un directorio de implementación momd y un archivo xcdatamodel "fuente" se compila en un archivo de implementación madre.

momc se encuentra en / Developer / usr / bin /. Si desea usarlo en sus propios scripts de compilación, su uso es el destino de origen momc, donde el origen es la ruta del modelo de datos principales para compilar y el destino es la ruta del resultado.

Por "/ Developer / usr / bin /" significan " /Aplicaciones/Xcode.app/Developer/usr/bin/ "

Puede agregar una secuencia de comandos en su esquema de destino y compilar esto automáticamente antes de cada compilación (o después, no creo que importe). Esto es en caso de que cambie el modelo durante el desarrollo.

Algo como esto:

mkdir -p "${BUILT_PRODUCTS_DIR}/your_model_name.momd" momc "${SRCROOT}/your_model_path/your_model_name.xcdatamodeld" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/your_bundle_name.bundle/your_model_name.momd"


Si intenta tener datos básicos en su marco, haga esto.

en YourFramework - agregar nuevo archivo / datos principales / modelo de datos ... - crear todos los objetos ....

Al crear un nuevo proyecto que utilizará YourFramework, asegúrese de que los datos centrales estén en

Esto creará toda la placa de la caldera dentro de AppDelegate.

en el proyecto de prueba - agregar Framework - agregar Framework como framework incrustado - DELETE el archivo .xcdatamodeld - en AppDelegate:

change - (NSManagedObjectModel *)managedObjectModel método - (NSManagedObjectModel *)managedObjectModel en:

NSBundle * testBundle = [NSBundle bundleWithIdentifier:@"YourFramework bundle id "]; NSURL *modelURL = [testBundle URLForResource:@"Model" withExtension:@"momd"];

donde el YourFramework bundle id es el identificador de paquete de YourFramework (en el identificador general / del paquete)

y Model es el nombre de su archivo .xcdatamodeld en YourFramework

Esto funciona.

Espero eso ayude.


Supongo que solo requiere el modelo de datos.

Si es así, creo que lo siguiente es consistentemente el método más exitoso para copiar en un archivo de modelo de datos de un proyecto a otro ...

  1. Elimine cualquier copia actual del archivo .xcdatamodeld que resida en el proyecto de destino.
  2. Cerrar Xcode.

    Usando Finder (o línea de cmd);

  3. Seleccione su carpeta de proyecto Xcode que contiene el archivo original .xcdatamodeld .
  4. Haga una copia del archivo original .xcdatamodeld .
  5. Mueva la copia del archivo .xcdatamodeld original a su proyecto de destino.

    Entonces...

  6. Abre Xcode.
  7. Usando el comando de menú "Agregar archivos a> su proyecto <", busque y agregue la copia del archivo original .xcdatamodeld a su proyecto.
  8. Cambie el nombre del archivo original .xcdatamodeld (si es necesario) utilizando Project Navigator.
  9. "Construye y ejecuta" tu proyecto objetivo.

¿Esto ayuda?