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

标签 ios swift core-data nsfetchrequest

我正在尝试获取 parent 的所有 child 。

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

}

最佳答案

fetch请求中使用的key路径必须与实际名称相匹配 核心数据关系,在你的例子中是“agendaEvents”, 没有隐含的“父”关系:

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

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

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

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

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

关于ios - Swift - CoreData NSPredicate - 获取父级的子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46380394/

相关文章:

ios - 触摸在 UIScrollView 内的 UITableView 上不起作用

swift - 如何使用下载的属性快速更改 UI

cocoa - 核心数据遍历具有 NSArrayController 内容集的实体?

ios - 是否可以调用 deleteObject : on object's own managedObjectContext?

ios - 如何获取 View 边距的大小?

ios - 从一个实体到多个实体的核心数据关系

swift - Swift 中的 'const' 关键字是什么?

ios - coreData executeFetchRequest 方法的竞争条件导致 nil 数据的问题

javascript - 在 iPhone 4/4s (iOS 7.0.1) 上放大文本输入字段时崩溃 Safari(并且仅在缩放时)

ios - Swift iOS 客户端证书认证