2017-09-23 1 views
1

Ich versuche, alle Kinder eines Elternteils zu holen.Swift - CoreData NSPredate - Fetch Children des Elternteils

In meinem Fall ist der Elternteil eine Entität AgendaEvent, die viele AgendaDate (die Kinder) hat.

so ist hier meine Funktion:

func getRelatedAgendaEvent(event: AgendaEvent) ->NSFetchRequest<AgendaDate> { 
    // create a fetch request that will retrieve all the AgendaDate. 
    let fetchRquest = NSFetchRequest<AgendaDate>(entityName: "AgendaDate") 

    // set the predicate to only keep AgendaDate related with the AgendaEvent selected 
    fetchRquest.predicate = NSPredicate(format: "parent == %@", event) 

    return fetchRquest 
} 

und ich verwende diese in didselectRow für eine Tableview:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    var eventToPass: AgendaEvent! 
    var eventDateToPassArray: [AgendaDate]! 

    eventToPass = myTempEvents[indexPath.row] 
    eventDateToPassArray = try! context.fetch(getRelatedAgendaEvent(event: eventToPass)) 
    DispatchQueue.main.async {() -> Void in 
     self.performSegue(withIdentifier: "EventToModify", sender: eventToPass) 
    } 
} 

}

Ich versuche eventDateToPassArray in einem Übergang zu verwenden. Der Fehler ich erhalte ist:

keypath parent not found in entity <NSSQLEntity AgendaDate id=1> with userInfo of (null) 

Ich bin nicht sicher, dies ist der richtige Weg ist. Ich versuche, ein NSSet (AgendaDate) zu aktualisieren, wenn der Benutzer ein AgendaEvent bearbeitet. Während der Aktualisierung und AgendaEvent aktualisiert der Benutzer das Datum im zugehörigen AgendaData NSSet.

Vielen Dank!

------------- UPDDATE

Martin Sie dies bedeuten:

AgendaDate + CoreDataProperties.swift

extension AgendaDate { 

@nonobjc public class func fetchRequest() -> NSFetchRequest<AgendaDate> { 
    return NSFetchRequest<AgendaDate>(entityName: "AgendaDate") 
} 

@NSManaged public var agendaDates: NSDate? 
@NSManaged public var agendaEvents: AgendaEvent? 

}

AgendaDate + CoreDataClass.Shift

import Foundation 
import CoreData 

@objc(AgendaDate) 
public class AgendaDate: NSManagedObject { 

} 
+0

Sie weisen eventDateToPassArray einen Wert zu, aber verwenden Sie es nie *. –

+0

@MartinR ich weiß .... ich habe nur gedruckt, um die Ergebnisse zu sehen..aber ich bekomme diesen Fehler – Marco

+0

Zeigen Sie, wie 'AgendaDate' definiert ist. Und wo * genau * bekommst du den Fehler? –

Antwort

1

Der Schlüsselpfad in der Anforderung muss den tatsächlichen Namen der Core Data Beziehung, in Ihrem Fall „agendaEvents“ entsprechen holen verwendet, gibt es keine implizite „Eltern“ Beziehung:

fetchRquest.predicate = NSPredicate(format: "agendaEvents == %@", event) 

Noch besser, verwenden #keyPath und die %K Expansion

fetchRquest.predicate = NSPredicate(format: "%K == %@", 
            #keyPath(AgendaDate.agendaEvents, event) 

so die dass Compiler die Gültigkeit des Schlüsselpfades überprüft. Dies hilft, unbekannte Schlüsselpfade oder Tippfehler zu vermeiden.

Beachten Sie, dass ein besserer Beziehungsname "agendaEvent" oder einfach "Ereignis" wäre, mit der Singularform für eine zu-eins-Beziehung.