Swift - CoreData NSPredicate - 获取父级的子级

Swift - CoreData NSPredicate - Fetch Children of parent

我正在尝试获取父项的所有子项。

在我的例子中,父项是一个实体 AgendaEvent,它有许多 AgendaDate(子项)。

所以这是我的函数:

 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 中的日期。

谢谢!

------------更新

马丁,你是这个意思:

议程日期+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?

}

议程日期+CoreDataClass.swift

import Foundation
import CoreData

@objc(AgendaDate)
public class AgendaDate: NSManagedObject {

}

获取请求中使用的关键路径必须与实际名称匹配 核心数据关系,在你的例子中 "agendaEvents", 没有隐含的 "parent" 关系:

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

更好的是,使用 #keyPath%K 扩展

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

因此 编译器 检查密钥路径的有效性。 这有助于避免使用未知的密钥路径或拼写错误。

请注意,更好的关系名称是 "agendaEvent" 或者只是 "event",一对一关系的单数形式。