CoreData 与价值的一对多关系

Posted

技术标签:

【中文标题】CoreData 与价值的一对多关系【英文标题】:CoreData one to many relationship comparing to value 【发布时间】:2017-09-13 14:56:44 【问题描述】:

我有两个实体:

议程活动

议程日期

AgendaDates 与 AgendaEvents 是一对多的关系。

我正在尝试存储在一个临时数组中 (var myTempEvents = [AgendaEvent] ()) 所有 AgendaEvents 在 AgendaDates 中都有一个等于定义日期的日期(让 myDate = Date() )

到目前为止,我有这个:

 var myEventDate = [String]()
 var myTempEvents = [AgendaEvent]()
 var myEvents = [AgendaEvent]()
 var myDate = Date()

 func getEventDates() 
    for event in myEvents 
        for date in (event.agendaDates as? Set<AgendaDate>)! 
            let eventDates = date.agendaDates
            eventDate = eventDates
            formatter.dateFormat = "dd MM yyyy"
            let eventDateString = formatter.string(from: eventDate)
            myEventDate.append(eventDateString)

        
    

我现在需要做的是检查 AgendaEvents 的日期是否等于 myDate,如果是,我需要将该事件添加到 myTempEvents。

这应该发生在这个函数内部:

func configureCell(cell: CalendarAgendaCell, indexPath: IndexPath) 
    for dates in calendar.selectedDates 
        for dateOfEvent in myEventDate 
            formatter.dateFormat = "dd MM yyyy"
            let dateToCompare = formatter.string(from: dates)
            if dateOfEvent == dateToCompare 
                let myEvent = myTempEvents[indexPath.row]
                cell.configureCell(agendaEvent: myEvent)

             else 
                //empty the tempArray

            
        
    

这个函数是由tableView的cellForRowAt函数调用的:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    // Dequeue Cell
    let cell = tableView.dequeueReusableCell(withIdentifier: "AgendaCell", for: indexPath) as! AgendaCell
    //Fetch model object to display
    configureCell(cell: cell, indexPath: indexPath)
    return cell

我不太擅长核心数据(仍在学习),因此非常感谢任何帮助。

谢谢!

更新------14/09/17

正如@Simo 所建议的那样,我已经像这样编辑了我的代码:

    func agendaEventsWithDate(date: Date) -> NSFetchRequest<NSFetchRequestResult>

    // create a fetch request that will retrieve all the AgendaEvents.
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "AgendaEvent")

    // set the predicate to only keep AgendaEvents where the related AgendaDate's date matches the passed in date.
    fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.agendaDates == %@", date as CVarArg)

    return fetchRequest


 let myTempEvents = try?context.fetch(agendaEventsWithDate(date: Date()))

上下文在哪里:

let ad = UIApplication.shared.delegate as! AppDelegate

让上下文 = ad.persistentContainer.viewContext

但是我得到了这个错误:

'fetch' 的模糊使用

谢谢!

【问题讨论】:

【参考方案1】:

有一种更简单的方法可以实现这一点,而无需自己进行比较。您应该阅读将 NSFetchRequest 与谓词一起使用的内容。

您可以获取存储在 Core Data 中的所有 AgendaEvent,然后过滤它们,以便只剩下包含与您指定日期匹配的 AgendaDate 的事件。

获取请求(包装在一个不错的提供程序函数中)可能看起来像:

func agendaEventsWithDate(date: Date) -> NSFetchRequest

    // create a fetch request that will retrieve all the AgendaEvents.
    let fetchRequest = NSFetchRequest(entityName: "AgendaEvent")

    // set the predicate to only keep AgendaEvents where the related AgendaDate's date matches the passed in date. 
    fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.date == %@", date)

    return fetchRequest

这显然假设您的AgendaEvent 实体与AgendaDate 的关系称为agendaDates,并且您的AgendaDate 实体具有称为date 的属性。

然后,当您执行 fetch 请求时,您将返回一个您正在查找的项目的数组。无需进行所有手动比较。

let myTempEvents = try? managedObjectContext?.executeFetchRequest(self.agendaEventsWithDate(someDate))

【讨论】:

你的意思是用这个:让ad = UIApplication.shared.delegate as! AppDelegate 让上下文 = ad.persistentContainer.viewContext;让 myTempEvents = 试试? context.execute(self.agendaEventsWithDate(date: somedate)) 你可以从任何你想要的地方访问你的托管对象上下文。就我个人而言,我不会在应用程序委托中设置我的核心数据堆栈,因为有更简洁的方法可以做到这一点,但这本身就是另一个话题。 好的,谢谢...我正在尝试按照您的建议进行操作...但我明白了:“获取”的模糊使用。我将编辑我的问题以准确显示我所做的... 对不起,我的代码示例是从内存中编写的,不是很 Swift 3。如果您将获取请求更改为 let fetchRequest = NSFetchRequest&lt;AgendaEvent&gt;(entityName: "AgendaEvent"),那应该会对您有所帮助。有一些很好的答案 here 可以解释为什么您会收到模棱两可的错误。 非常感谢您的帮助.. 但仍然无法正常工作... :( 已按照您的建议编辑了 fetchrequest 并且还需要添加 myTempEvents... 作为 [AgendaEvent]... 但是我一构建应用程序就崩溃了......这是否可能是因为 AgendaEvent 也是与另一个实体的一对多关系?(关系是游泳池,是一个..)

以上是关于CoreData 与价值的一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

与 coredata 的一对多关系

一对多关系CoreData Swift

CoreData派生属性查看一对多关系是不是包含属性

CoreData - 如何在一对多关系中添加多个对象

IOS/Objective-C/CoreData:以一对多关系编辑NSSet

获取对象时无法访问一对多CoreData关系