9

Phew, scusa per il titolo lungo.Salvataggio di una singola entità CoreData (non dell'intero contesto) pur mantenendo funzionalità di NSFetchedResultController

Ho un singolo oggetto gestito Contesto in cui sto memorizzando brani derivati ​​da due posizioni diverse. Ottengo alcune delle canzoni dall'archiviazione persistente sul telefono (utilizzando Core Data), e tiro alcune delle canzoni da un database online. Entrambe le canzoni sono della stessa sottoclasse MananagedObject. Vorrei che entrambi questi brani si trovassero in un unico contesto perché vorrei che fossero entrambi visualizzati in una vista tabella collegata a un NSFetchedResultsController.

Il problema si verifica quando desidero salvare uno dei brani. Non voglio salvare tutte le canzoni che ho estratto dal database online al telefono. Voglio solo salvare la singola canzone, quindi un semplice [moc save] non funziona. L'altro problema è che dopo aver salvato la singola canzone, voglio comunque che le canzoni estratte da online siano nel contesto (ma di nuovo, non salvate). Credo di avere un paio di opzioni diverse:

1) È possibile avere un controller NSFetchedResults connesso a più contesti?

2) Potrei spostare tutte le canzoni estratte dal database online in un contesto temporaneo separato, salvare nel contesto originale e quindi spostare indietro tutti i brani. (vedi: How do I copy or move an NSManagedObject from one context to another?)

3) Ricorda tutte le coppie chiave-valore per i brani online, elimina i brani online dal contesto, salva il contesto originale, reinserisci tutti i brani online nel contesto originale in base a delle coppie chiave-valore salvate.

4) Sono un enorme n00b e mi manca qualcosa di più facile.

Grazie!

+0

Che cosa vuoi veramente risparmiare? La posizione della canzone o i dati della canzone attuale (file)? – sosborn

risposta

8

Penso che la cosa più semplice da fare sarebbe avere un secondo NSPersistentStore collegato al coordinatore del negozio permanente. Puoi fare in modo che quel negozio sia un negozio in memoria e memorizzare tutti i risultati "online" in quel negozio (temporaneo). È possibile specificare in quale archivio deve essere salvato un oggetto appena inserito con assignObject:toPersistentStore:. Una volta che hai fatto questo, puoi salvare liberamente, dal momento che il "salvataggio" avverrà solo nella memoria delle tue canzoni online.

Quindi, quando si desidera spostare un brano dal set online al set permanente, è sufficiente eliminarlo e reinserirlo, assegnando il nuovo oggetto al proprio archivio permanente permanente con lo stesso metodo.

Questo vi permetterà di utilizzare un singolo NSManagedObjectContext collegato al vostro NSPersistentStoreCoordinator, che vedrà oggetti da entrambi i NSPersistentStore s.

+0

Apple promuove l'utilizzo di più archivi persistenti per scenari simili (come i dati di avvio in scatola forniti con l'app). Direi che è una buona idea ogni volta che hai entità i cui piani di archiviazione persistenti sono diversi. – rickster

+0

Ottima risposta. Indovina che la risposta alla mia domanda era l'opzione n. 4 ... – rizzes

+1

Attenzione se stai mantenendo le relazioni tra entità che utilizzano archivi persistenti diversi. Secondo i nostri amici di Apple: "Devi stare attento a non creare relazioni da istanze in un archivio persistente a istanze in un altro archivio persistente, in quanto questo non è supportato da Core Data. Se è necessario creare una relazione tra entità in negozi diversi , in genere si utilizzano le proprietà recuperate "https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW5 – NSTJ

5

La soluzione di Jesse funzionerà perfettamente.

Tuttavia, come altra opzione, è possibile utilizzare semplicemente un contesto nidificato, proprio come si farebbe per un ispettore dettagliato.

Questo contesto può contenere tutti gli elementi "temporanei", ma poiché è figlio del tuo contesto di "salvataggio", tutti i recuperi funzioneranno correttamente.

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

ALI i tuoi salvataggi verranno inseriti in mainManagedObjectContext e salvati con salvataggio :. Tutti i tuoi oggetti temporanei andranno in tempContext.

Collegare anche il controller dei risultati recuperato a tempContext.

Quando si è pronti a sbarazzarsi degli elementi temporanei, basta impostare tempContext su zero.