2015-06-17 5 views
9

Nella sessione video WWDC15, 'What's New in Core Data' alle 10:45 min (nella presentazione) l'ingegnere Apple descrive una nuova funzionalità del generatore di modelli che consente per specificare proprietà uniche. Una volta impostate queste proprietà univoche, Core Data non creerà un oggetto duplicato con quella proprietà. Ciò suppone di eliminare la necessità di verificare se un oggetto identico prima di creare un nuovo oggetto.Come implementare la nuova proprietà "unique" del builder Core Data in iOS 9.0 Beta

Ho sperimentato questo, ma non ho avuto fortuna a impedire la creazione di nuovi oggetti con identiche proprietà "uniche" (oggetti duplicati). Oltre alla spiegazione video di 5 minuti, non ho trovato altre informazioni che descrivono come utilizzare questa funzione.

enter image description here

Qualcuno ha alcuna esperienza di attuazione l'attributo di proprietà 'unico' nel modello di dati Nucleo?

+1

Non riesco a farlo funzionare. La proprietà "Unique" nelle impostazioni dell'entità è stata rinominata in "Constraints" –

+1

Ho appena scritto un [post di blog su questo] (http://dorianroy.com/blog/2015/09/how-to-implement-unique -constrains-in-core-data-with-ios-9 /) –

risposta

-1

Non conosco la risposta giusta, in quanto si tratta di una versione beta, ma dopo aver giocato con lui per un minuto ho trovato un modo per farlo funzionare:

  1. dice il modello che attribuisce forma il vincolo univoco, esattamente come mostrato nell'immagine che hai nella tua domanda.

  2. aggiungere un nuovo record:

let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag
  1. Assegnare i valori alle attribues.

  2. Salva le modifiche:

do { 
    try context.save() 
} catch let error as NSError { 
    print("Error: \(error.localizedDescription)") 
    context.reset() 
}

la chiave è nel blocco catch. Se si verifica un errore, ripristinare il contesto allo stato precedente. Poiché l'operazione di salvataggio non è riuscita, i record duplicati non saranno lì.

Si prega di notare che è necessario controllare l'errore per vedere se è stato causato da una registrazione duplicata.

Spero che questo aiuti.

11

Risposta breve: Avrai bisogno di aggiungere questa riga al vostro Core Data codice di installazione dello stack:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

Risposta lunga: Ho lottato con questo per un po ', ma credo di averlo capito ora:

Unique Constraints (UC) non impediscono la creazione di duplicati in un contesto. Solo quando si tenta di salvare quel contesto, Core Data verifica l'unicità degli UC.

Se trova più di un oggetto con lo stesso valore per un UC, il comportamento predefinito è di generare un errore perché il criterio di unione predefinito per i conflitti è NSErrorMergePolicyType. L'errore contiene gli oggetti in conflitto nel suo userInfo.conflictList, quindi è possibile risolvere il conflitto manualmente.

Ma la maggior parte delle volte probabilmente si desidera utilizzare uno degli altri merge policies e lasciare che Core Data unisca automaticamente i conflitti. Queste politiche di unione esistevano prima, vengono utilizzate per conflitti tra oggetti in diversi contesti. Forse questo è il motivo per cui non sono stati menzionati nel contesto della funzionalità UC di WWDC Session 220. Di solito la scelta giusta è NSMergeByPropertyObjectTrumpMergePolicy. In pratica dice "i nuovi dati superano i vecchi dati", che è ciò che si vuole nello scenario comune quando si importano nuovi dati da fonti esterne.

(Suggerimento: Innanzitutto ho riscontrato problemi nella verifica di questo comportamento, poiché gli oggetti duplicati sembrano rimanere nel contesto fino al termine dell'operazione di salvataggio, che nel mio caso è avvenuta in modo asincrono in una coda in background. oggetti subito dopo aver premuto il pulsante Salva, potresti comunque vedere i duplicati).

+0

Grazie per la risposta dettagliata e il post del blog :). Ho notato che "PropertyObjectTrumpMergePolicyType" interromperà la relazione con altre entità (al contrario di ciò che hai menzionato nel post del blog). Avete qualche esempio o esempio di codice che dimostra che le relazioni non vengono toccate con questa politica di fusione? –

+0

Qualcuno lo ha citato su Twitter qualche giorno fa. Forse c'è stato un cambiamento nelle versioni recenti del sistema operativo. Non ho usato questa funzione da allora. Ma la mia ipotesi è che il comportamento potrebbe dipendere dalla regola di cancellazione della relazione. Ti suggerirei di riportare la tua esperienza nei commenti del blog o di aprire una nuova domanda qui. –