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",一对一关系的单数形式。
我正在尝试获取父项的所有子项。
在我的例子中,父项是一个实体 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",一对一关系的单数形式。