Mar*_*rco 5 core-data nsfetchrequest ios swift
我正在尝试获取父母的所有孩子。
在我的例子中,父对象是一个实体 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
}
Run Code Online (Sandbox Code Playgroud)
我在 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)
}
}
Run Code Online (Sandbox Code Playgroud)
}
我正在尝试在 segue 中使用 eventDateToPassArray。我得到的错误是:
keypath parent not found in entity <NSSQLEntity AgendaDate id=1> with userInfo of (null)
Run Code Online (Sandbox Code Playgroud)
我不确定这是正确的道路。当用户编辑 AgendaEvent 时,我试图更新 NSSet (AgendaDate)。所以基本上在更新和 AgendaEvent 时,用户也会更新相关 AgendaData NSSet 中的日期。
谢谢!
-------------更新
马丁你的意思是:
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?
Run Code Online (Sandbox Code Playgroud)
}
AgendaDate+CoreDataClass.swift
import Foundation
import CoreData
@objc(AgendaDate)
public class AgendaDate: NSManagedObject {
}
Run Code Online (Sandbox Code Playgroud)
获取请求中使用的关键路径必须与核心数据关系的实际名称匹配,在您的例子“agendaEvents”中,没有隐式的“父”关系:
fetchRquest.predicate = NSPredicate(format: "agendaEvents == %@", event)
Run Code Online (Sandbox Code Playgroud)
更好的是,使用#keyPath和%K扩展
fetchRquest.predicate = NSPredicate(format: "%K == %@",
#keyPath(AgendaDate.agendaEvents), event)
Run Code Online (Sandbox Code Playgroud)
因此编译器检查关键路径的有效性。这有助于避免使用未知的关键路径或拼写错误。
请注意,更好的关系名称是“agendaEvent”或“event”,单数形式表示一对一关系。
| 归档时间: |
|
| 查看次数: |
2692 次 |
| 最近记录: |