9

Uff, disculpe el título largo.Guardar una única entidad CoreData (no todo el contexto) Mientras se mantiene la funcionalidad NSFetchedResultController

Tengo un solo contexto de objeto administrado donde estoy almacenando canciones derivadas de dos ubicaciones diferentes. Obtengo algunas de las canciones del almacenamiento persistente en el teléfono (usando Core Data) y selecciono algunas de las canciones de una base de datos en línea. Ambas canciones son de la misma subclase MananagedObject. Me gustaría que ambas canciones estuvieran en un único contexto porque me gustaría que aparecieran en una vista de tabla conectada con NSFetchedResultsController.

El problema ocurre cuando me gustaría guardar una de las canciones. No quiero guardar todas las canciones que saqué de la base de datos en línea para el teléfono. Solo quiero guardar la canción individual, así que un simple [guardar en moc] no funciona. El otro problema es que después de guardar la canción individual, todavía quiero que las canciones extraídas en línea estén en el contexto (pero, una vez más, no guardadas). Creo que tengo un par de opciones diferentes:

1) ¿Es posible tener un controlador NSFetchedResults conectado a múltiples contextos?

2) Podría mover todas las canciones extraídas de la base de datos en línea a un contexto temporal separado, guardarlas en el contexto original y luego volver a mover todas las canciones. (ver: How do I copy or move an NSManagedObject from one context to another?)

3) Recuerde todos los pares clave-valor para las canciones en línea, elimine las canciones en línea del contexto, guarde el contexto original, inserte todas las canciones en línea nuevamente en el contexto original basado en de los pares clave-valor guardados.

4) Soy un gran n00b y me falta algo más fácil.

Gracias!

+0

¿Qué es lo que realmente quiere guardar? La ubicación de la canción o los datos de la canción real (archivo)? – sosborn

Respuesta

8

Creo que lo más fácil sería tener un segundo NSPersistentStore conectado a su coordinador de tienda persistente. Puede hacer que esa tienda sea una tienda en memoria y almacenar todos sus resultados "en línea" en esa tienda (temporal). Puede especificar en qué tienda debe guardarse un objeto recién insertado con assignObject:toPersistentStore:. Una vez que hayas hecho esto, puedes guardarlo libremente, ya que el "guardar" solo pasará a la memoria de tus canciones en línea.

Luego, cuando desee mover una canción del conjunto en línea al conjunto permanente, simplemente elimínela y vuelva a insertarla, asignando el nuevo objeto a su tienda persistente permanente con el mismo método.

Esto le permitirá usar un solo NSManagedObjectContext conectado a su NSPersistentStoreCoordinator, que verá objetos de ambos NSPersistentStore s.

+0

Apple promueve el uso de varias tiendas persistentes para escenarios similares (como los datos de arranque enlatados que vienen con la aplicación). Diría que es una buena idea cuando tienes entidades cuyos planes de almacenamiento persistentes son diferentes. – rickster

+0

Gran respuesta. Supongo que la respuesta a mi pregunta fue la opción n. ° 4 ... – rizzes

+1

. Tenga cuidado si mantiene las relaciones entre las entidades que utilizan diferentes almacenes persistentes. Según nuestros amigos de Apple: "Debes tener cuidado de no crear relaciones entre las instancias de una tienda persistente y las instaladas en otra tienda persistente, ya que esto no es compatible con Core Data. Si necesitas crear una relación entre entidades en diferentes tiendas , por lo general, usa las propiedades obtenidas "https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW5 – NSTJ

5

La solución de Jesse funcionará muy bien.

Sin embargo, como otra opción, puede simplemente usar un contexto anidado, como lo haría para un inspector detallado.

Ese contexto puede contener todos sus elementos "temporales", pero dado que es un elemento secundario de su contexto de "guardado", todas las recuperaciones funcionarán correctamente.

NSManagedContext *tempContext = [[NSManagedContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
tempContext.parentContext = mainManagedObjectContext; 

todo tu ahorra será insertado en mainManagedObjectContext, y guarda con guardar :. Todos sus elementos temporales entrarán en tempContext.

Adjunte el controlador de resultados obtenidos al tempContext también.

Cuando esté listo para deshacerse de los elementos temporales, simplemente configure tempContext en nil.

Cuestiones relacionadas