Sono perplesso e non sono stato in grado di rintracciare alcun tutorial o documento sul modo migliore per farlo.Dati principali con SWIFT: come eliminare un oggetto dall'entità di relazione?
Problema: Ho due entità, Persona e Posizione. La persona può avere molte posizioni. Ho tutto configurato correttamente e posso aggiungere/rimuovere persone da una vista tabella, nessun problema.
Il problema riscontrato sta tentando di aggiungere e rimuovere la posizione dopo la creazione della prima: quando la persona viene inserita per la prima volta, aggiunge anche una posizione.
A questo scopo, il (persona Entity) Classe PersonModel ha:
class PersonModel: NSManagedObject {
@NSManaged var Name: String
@NSManaged var Age: String
@NSManaged var Location: NSOrderedSet
}
La classe LocationModel (Località Entity) ha:
class LocationModel: NSManagedObject {
@NSManaged var State: String
@NSManaged var Person: PersonModel
}
Qual è il modo migliore per accedere ed eliminare gli elementi nell'entità della posizione? Devo eliminare l'oggetto da PersonsModel o tramite LocationsModel?
nel seguente modo:
func deleteObject(rowIndex:NSIndexPath){
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName:"Locations")
var error: NSError?
locationsArray = managedContext.executeFetchRequest(fetchRequest,error: &error)!
managedContext.deleteObject(locationsArray[rowIndex.row] as NSManagedObject)
var error:NSError? = nil
if (!managedContext.save(&error)){
abort()
}
}
che non funziona perché restituisce tutte le sedi, non solo le posizioni per gli oggetti associati con il genitore/Persona correlati. Ci deve essere un modo semplice per farlo - forse con un predicato?
Qualcuno può aiutarmi a indicarmi la giusta direzione?
Grazie!
UPDATE: Per le persone future che hanno la stessa sfida.
1) Assicurarsi che le regole di eliminazione delle relazioni siano corrette. Nel mio caso, volevo essere in grado di eliminare le posizioni ma mantenere la persona. Le regole di eliminazione necessari per essere configurato come segue: Posizione - Elimina regola: Cascade, persona - Elimina regola: Azzera
2) Il codice finale è simile al seguente:
func deleteTrigger(rowIndex:NSIndexPath){
var personRef: PersonModel = existingItem as PersonModel
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext:NSManagedObjectContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName:"Locations")
let predicate = NSPredicate(format: "Person == %@", personRef)
fetchRequest.predicate = predicate
var error: NSError? = nil
locationArray = managedContext.executeFetchRequest(fetchRequest,error: &error)!
managedContext.deleteObject(locationArray[rowIndex.row] as NSManagedObject)
locationArray.removeAtIndex(rowIndex.row)
tableview.deleteRowsAtIndexPaths([rowIndex], withRowAnimation: UITableViewRowAnimation.Fade)
if (!managedContext.save(&error)){
abort()
}
}