2009-10-25 10 views
9

Sto lavorando a un'applicazione che eseguirà una ricerca su un servizio online e genererà molti oggetti Result. Un oggetto Result è un NSManagedObject, inizializzato come richiesto associandolo a NSManagedObjectContext.Come posso creare molti oggetti temporanei e quindi salvarne solo uno utilizzando i dati principali?

Gli utenti devono essere in grado di selezionare un "Risultato" e salvarlo come "Preferito". Nell'applicazione questo è semplice come associare l'entità Risultato con una nuova entità preferita e salvare il contesto.

Il problema è che ogni singolo risultato nel contesto ovviamente viene salvato nel database insieme a quello che desidero.

Ho visto molti esempi di utilizzo di più istanze NSManagedObjectContext per gestire varie situazioni di creazione e persistenza. Tutti sembrano girare attorno all'idea di creare nuove istanze con un solo contesto e quindi unirle su Salva in un altro contesto al fine di evitare un'altra esecuzione di FetchRequest. Questi esempi non risolvono il problema poiché continuano a portare a ogni entità Risultato salvata.

Qualcuno ha qualche suggerimento? Sono totalmente sfruttato per questo.

risposta

5

È necessario utilizzare un contesto diverso per ciascun oggetto. L'utilizzo di un contesto dell'oggetto gestito separato consente di lavorare come segue. Quando l'utente seleziona il suo oggetto preferito, basta scartare i contesti relativi agli oggetti risultato rimanenti. Non c'è bisogno di unire le modifiche, ecc. Esiste fondamentalmente un compromesso. Finisci per gestire (creare/scartare) diversi contesti, ma poi raggiungi facilmente il tuo obiettivo. Altrimenti, puoi ancora farlo usando un solo contesto. Tuttavia, devi inserire o eliminare esplicitamente ciascun oggetto come mostrato nei seguenti frammenti di codice.

Prova questo. Solo per l'oggetto preferito che si desidera salvare, effettuare le seguenti operazioni:

[managedObjectContext insertObject:theFavorite]; 

Per ciascuno degli altri oggetti risultato fare questo, invece:

[managedObjectContext deleteObject:aResult]; 

quindi salvare come al solito

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

} 

Ciò salverà SOLO l'oggetto preferito selezionato.

+0

Siamo andati con la prima parte della risposta. Stiamo usando un contesto per oggetto grafico e salvandolo quando necessario. – user174448

3

Creare oggetti risultato che non siano sottoclassi NSManagedObject. Quando l'utente ne sceglie una, crea una singola istanza gestita e la salva.

+0

Stavo semplificando il problema per ragioni di brevità. L'oggetto Risultato è un'entità con molte proprietà e diverse relazioni. Il pensiero di duplicare le classi mi fa vomitare in bocca :) – user174448

4

Preferisco utilizzare un contesto NIL e disporre di una classe del modello di dominio di base per gestire in modo ricorsivo l'aggiunta di oggetti a un contesto valido quando voglio mantenerli. Funziona davvero bene (e in modo pulito!) ... codice disponibile qui ... Temporary Core Data

+0

Questa è la buona soluzione per oggetto temporaneo. Tuttavia, cosa succede quando aggiungi un oggetto al set di relazioni che * ha * un contesto? Qual è l'approccio migliore qui? –

+0

Vedi anche questa domanda: http://stackoverflow.com/questions/3256195/how-to-deal-with-temporary-nsmanagedobject-instances – Symmetric

Problemi correlati