2009-10-25 13 views
9

Estoy trabajando en una aplicación que realizará una búsqueda en un servicio en línea y generará muchos objetos Result. Un objeto Result es un NSManagedObject, inicializado como se requiere al asociarlo con un NSManagedObjectContext.¿Cómo creo muchos objetos temporales y luego solo guardo uno usando Core Data?

Los usuarios deberían poder seleccionar un "Resultado" y guardarlo como "Favorito". En la aplicación, esto es tan simple como asociar la entidad Result con una nueva entidad favorita y guardar el contexto.

El problema es que cada resultado individual en el contexto del curso se guarda en la base de datos junto con el que yo quiero Favorito.

He visto muchos ejemplos del uso de varias instancias de NSManagedObjectContext para administrar diversas situaciones de creación y persistencia. Todos parecen girar en torno a la idea de crear nuevas instancias con un Contexto y luego fusionarlas en guardarlas en otro contexto con el fin de evitar otra ejecución de FetchRequest. Estos ejemplos no resuelven el problema ya que aún conducen a que se guarde cada entidad de resultado.

¿Alguien tiene alguna sugerencia? Estoy totalmente explotado en esto.

Respuesta

5

Debe utilizar un contexto diferente para cada objeto. Usar un contexto de objeto gestionado por separado le permite trabajar de la siguiente manera. Cuando el usuario selecciona su objeto favorito, simplemente descarta los contextos relacionados con los objetos resultantes restantes. No es necesario combinar cambios, etc. Básicamente, hay una compensación. Terminas administrando (creando/descartando) varios contextos, pero luego logras tu objetivo fácilmente. De lo contrario, aún puedes hacer esto usando solo un contexto único. Sin embargo, debe insertar o eliminar explícitamente cada objeto como se muestra en los siguientes fragmentos de código.

Pruebe esto. Sólo para el objeto favorito que desea guardar, haga lo siguiente:

[managedObjectContext insertObject:theFavorite]; 

Para cada uno de los otros objetos de resultado debe hacerse lo siguiente:

[managedObjectContext deleteObject:aResult]; 

continuación, guarde como de costumbre

NSError *error = nil 
if (![managedObjectContext save:&error]) { 
    // Handle error 

} 

Esto salvará SÓLO el objeto favorito seleccionado.

+0

Fuimos con la primera parte de tu respuesta. Estamos utilizando un Contexto por gráfico de objetos y lo guardamos según sea necesario. – user174448

3

Create Objetos Result que no son subclases NSManagedObject. Cuando el usuario elige uno, crea una única instancia administrada y guarda eso.

+0

Estaba simplificando el problema en aras de la brevedad. El objeto Result es una entidad con muchas propiedades y varias relaciones. La idea de duplicar las clases me hace vomitar en mi boca :) – user174448

4

Prefiero usar un contexto NIL y tener una clase de modelo de dominio base para manejar recursivamente la adición de objetos a un contexto válido cuando quiero persistirlos. Funciona muy bien (¡y limpiamente!) ... código disponible aquí ... Temporary Core Data

+0

Esta es la buena solución para el objeto temporal. Sin embargo, ¿qué sucede cuando agrega un objeto al conjunto de relaciones que * tiene * un contexto? ¿Cuál es el mejor enfoque aquí? –

+0

También vea esta pregunta: http://stackoverflow.com/questions/3256195/how-to-deal-with-temporary-nsmanagedobject-instances – Symmetric

Cuestiones relacionadas