2017-09-14 78 views
1

H. 我有一个名为Agendadate的实体,一个名为AgendaEvent。 AgendaEvent与AgendaDate(议程日期)具有多对多关系。Swift coreData - 格式日期并在谓词中使用它

在我的AgendaDate我有一个对象日期(类型日期)。

我使用的是谓语,像这样:

fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.dates == %@", date as CVarArg) 

我试图格式化日期有这样的:

“年月日”,而不是“年月日HH:MM: ss“

我需要比较谓词中的两个日期,但没有时间? 有可能吗?

UPDATE ----- 这里是我的功能更新,你建议:

func agendaEventsWithDate(date: Date) -> NSFetchRequest<AgendaEvent> 
{ 
    // create a fetch request that will retrieve all the AgendaEvents. 
    let fetchRequest = NSFetchRequest<AgendaEvent>(entityName: "AgendaEvent") 

    // set the predicate to only keep AgendaEvents where the related AgendaDate's date matches the passed in date. 
    let cal = Calendar.current 
    let startOfDay = cal.startOfDay(for: eventDate) 
    let endOfDay = cal.date(byAdding: .day, value: 1, to: startOfDay)! 
    print(startOfDay) 
    print(endOfDay) 
    // fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.agendaDates == %@", date as CVarArg) 
    fetchRequest.predicate = NSPredicate(format: "SUBQUERY(agendaDates, $a, $a.dates >= %@ AND $a.dates < %@)[email protected] > 0", 
           startOfDay as NSDate, endOfDay as NSDate) 

    return fetchRequest 
} 

,这里是应该配置的电池,并采取只具有选定日期的同一天发生的事件的功能:

func configuringCell(cell: CalendarAgendaCell, indexPath: IndexPath) { 
    for dates in calendar.selectedDates { 
     for dateOfEvent in myEventDate { 
      formatter.dateFormat = "dd MM yyyy" 
      let dateToCompare = formatter.string(from: dates) 
      formatter.dateFormat = "dd-MM-yyyy" 
      let comparingDate = formatter.date(from: dateToCompare)! 
      if dateOfEvent == dateToCompare { 
       myTempEvents = try! context.fetch(agendaEventsWithDate(date: comparingDate)) 
       let myEvent = myTempEvents[indexPath.row] 
       cell.configureCell(agendaEvent: myEvent) 

      } else { 
       // the array is empty 

      } 
     } 
    } 
} 
+0

你告诉核心数据中的日期有hh:mm:ss,你希望它在删除谓词时比较吗? –

+0

@SandeepBhandari是的。核心数据也随时间存储。当我在谓词中使用它来比较它时,我希望日期没有时间 – Marco

+0

@SandeepBhandari :)谢谢! – Marco

回答

0

不要为此使用自定义字符串格式。您想在指定日期的同一天取得 所有与Agendadate对象相关的日期为 的条目。

所以,你首先计算这一天的开始和结束:

let date = Date() 

let cal = Calendar.current 
let startOfDay = cal.startOfDay(for: date) 
let endOfDay = cal.date(byAdding: .day, value: 1, to: startOfDay)! 

然后用这个SUBQUERY:

let predicate = NSPredicate(format: "SUBQUERY(agendaDates, $a, $a.dates >= %@ AND $a.dates < %@)[email protected] > 0", 
          startOfDay as NSDate, endOfDay as NSDate) 

它测试$a.dates >= startDate AND $a.dates < endDate所有 相关对象,如果有产生真正的至少有一个匹配 的条件。

+0

感谢您的回答。可能我还没有真正明白。我试图这样做的是在数组中追加所有具有特定议程日程的AgendaEvent。所以基本上我选择一个日期。如果日期与AgendaDate中存在的日期相匹配,那么我想将这些AgendaEvent存储在数组中。也许我做错了什么,但如果我添加您的解决方案比它采取所有AgendaEvent。我将编辑我的问题,以便您可以看到我的代码。谢谢 – Marco

+0

@Marco:我建议的谓词应该这样做。我注意到在你的代码中,谓词赋值被注释掉了:'// fetchRequest.predicate = ...',所以所有的反对都被提取。 –

+0

对不起....错字。我已经评出了旧的。在你的代码中被触发 – Marco