2017-09-23 162 views
1

我试图获取父项的所有子项。Swift - CoreData NSPredicate - 获取父项的子项

在我的情况下,父母是一个实体AgendaEvent,它有很多议程日程(孩子)。

所以这里是我的功能:

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 
} 

,我用这个在didselectRow了的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) 
    } 
} 

}

我想在SEGUE使用eventDateToPassArray。 我得到的错误是:

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

我不知道这是正确的道路。我试图在用户编辑AgendaEvent时更新NSSet(AgendaDate)。因此,基本上在更新和AgendaEvent时,用户还会更新相关AgendaData NSSet中的日期。

谢谢!

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

马丁你的意思是这样的:

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.swift

import Foundation 
import CoreData 

@objc(AgendaDate) 
public class AgendaDate: NSManagedObject { 

} 
+0

您为eventDateToPassArray指定一个值,但永远不会使用* it。 –

+0

@MartinR我知道....我打印只是为了看结果..但我得到那个错误 – Marco

+0

显示'AgendaDate'是如何定义的。哪里*究竟*你会得到错误? –

回答

1

获取请求中使用的关键路径必须实际名称的核心数据关系的 ,你的情况符合“agendaEvents”, 没有隐含的“父”的关系:

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

更妙的是,使用#keyPath%K膨胀

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

所以该编译器检查键路径的有效性。 这有助于避免使用未知的键路径或拼写错误。

请注意,一个更好的关系名称将是“agendaEvent” 或只是“事件”,与单数形式为一对一的关系。