我试图抓住父母的所有孩子。
在我的情况下,父母是一个实体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中的日期。
谢谢!
------------- 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 :(得分:2)
获取请求中使用的密钥路径必须与实际名称匹配 核心数据关系,在您的情况下&#34; agendaEvents&#34;, 没有隐含的&#34;父母&#34;关系:
fetchRquest.predicate = NSPredicate(format: "agendaEvents == %@", event)
更好的是,使用#keyPath
和%K
扩展
fetchRquest.predicate = NSPredicate(format: "%K == %@",
#keyPath(AgendaDate.agendaEvents, event)
所以编译器检查密钥路径的有效性。 这有助于避免使用未知的密钥路径或拼写错误。
请注意,更好的关系名称将是&#34; agendaEvent&#34; 或只是&#34;事件&#34;,以单一形式形成一对一的关系。