2015-02-06 23 views
5

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() 
    } 

} 

risposta

3

Utilizzando predicati è esattamente a destra. Che ci si vuole impostare il predicato per la fetchRequest

let predicate = NSPredicate(format: "uniqueKey == %@", "value") 
fetchRequest.predicate = predicate 

Quindi è possibile eliminare il risultato

0

ne dite:

locationsArray = personRef.Location 

Penso che sia molto più semplice