2017-09-14 5 views
1

H. 私はAgendadateというエンティティとAgendaEventというエンティティを持っています。 AgendaEventには、AgendaDate(agendaDates)との多対多の関係があります。Swift coreData - フォーマット日付とそれを述語で使用

私のAgendaDateにはオブジェクト日付(Date型)があります。

私はそうのような述語を使用しています:MM:YYYY MMはHHをddを代わりに」の

"DD MMのYYYY":

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

私は形式にしようとしているが、これを持っている日付ss "

述語で2つの日付を比較する必要がありますが、時間はありませんか? それは可能ですか?

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使用:それはすべての 関連オブジェクトの$a.dates >= startDate AND $a.dates < endDateをテストし、そこにある場合はtrue生じ

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

を少なくとも1つの一致が条件です。

+0

あなたの答えをありがとう。おそらく私は本当に理解していない。私がそうしようとしているのは、特定のagendaDateを持つすべてのAgendaEventを配列に追加することです。だから基本的に私は日付を選択します。 AgendaDateに存在する日付と日付が一致する場合、それらのAgendaEventを配列に格納したいと思います。たぶん私は何か間違っているが、私はすべてのAgendaEventよりもあなたのソリューションを追加する場合。私は私のコードを見ることができるように私の質問を編集します。ありがとうございます – Marco

+0

@マルコ:私の提案する述語はそれを行う必要があります。あなたのコードでは、述語の割り当てがコメントアウトされていることに気付きました: '// fetchRequest.predicate = ...'、それですべてのオブジェクトがフェッチされました。 –

+0

申し訳ありませんがオタク。私は古いものをコメントしました。あなたのコードがトリガーされました – Marco

関連する問題