2017-09-13 54 views
0

我有两个实体:CoreData一对多的关系比较看重

AgendaEvents

AgendaDates

AgendaDates有一个与AgendaEvents一对多的关系。

我试图在一个临时数组来存储(VAR myTempEvents = [AgendaEvent]()) 所有具有内部AgendaEvents AgendaDates一个日期,它等于一个定义的日期(让数值指明MyDate =日期())

到目前为止,我有这样的:

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 

      } 
     } 
    } 
} 

而这个功能是由cellForRowAt FUNC键的tableView称为:

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 
} 

我不是在核心数据(仍在学习)非常好,所以任何帮助将非常感激。

谢谢!

UPDATE --------- 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'

谢谢!

回答

0

有一种更简单的方法来实现这一点,而无需亲自进行比较。你应该阅读使用带谓词的NSFetchRequest

您可以获取存储在核心数据中的所有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

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

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

你的意思是使用这个:let ad = UIApplication.shared.delegate as! AppDelegate let context = ad.persistentContainer.viewContext;让myTempEvents =试试? context.execute(self.agendaEventsWithDate(date:somedate)) – Marco

+0

那么您可以从任何地方访问您的托管对象上下文。就我个人而言,我不会在应用程序委托中设置我的Core Data堆栈,因为有更多更干净的方法来完成它,但这是另一个话题本身。 – Simo

+0

好的,谢谢......我正在尝试按照你的建议去做......但我得到了这个:模糊地使用'fetch'。我将编辑我的问题,以准确显示我所做的事情...... – Marco