Swift - CoreData NSPredicate - 获取父母的孩子

Posted

技术标签:

【中文标题】Swift - CoreData NSPredicate - 获取父母的孩子【英文标题】:Swift - CoreData NSPredicate - Fetch Children of parent 【发布时间】:2017-09-23 14:01:57 【问题描述】:

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

在我的例子中,父级是一个实体 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 中的日期。

谢谢!

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

马丁你的意思是:

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 


【问题讨论】:

您为 eventDateToPassArray 赋值,但从不使用它。 @MartinR 我知道....我打印只是为了查看结果..但我得到了那个错误 显示如何定义AgendaDate。您在哪里确切地得到错误? @MartinR 当我在表中选择 AgendaEvent 时出现错误。你是指对象还是在控制器中是如何定义的? 显示定义 AgendaDate 属性的类/扩展代码。 【参考方案1】:

获取请求中使用的密钥路径必须与实际名称匹配 核心数据关系,在你的情况下是“议程事件”, 没有隐含的“父”关系:

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

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

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

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

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

【讨论】:

我认为您缺少括号。您打开NSPredicate#keypath,但只关闭一次

以上是关于Swift - CoreData NSPredicate - 获取父母的孩子的主要内容,如果未能解决你的问题,请参考以下文章

Swift 构建 CoreData,语义问题

Swift - 删除CoreData行[重复]

使用 Coredata 学习 Swift:为啥我没有得到任何 UITableViewCells?

在 CoreData (Swift) 中存储位置

CoreData 关系不一致(Swift)

CoreData学习:Core Data Stack(Swift)