2017-09-14 5 views
1

H. J'ai une entité appelée Agendadate et une appelée AgendaEvent. AgendaEvent a une relation de plusieurs à plusieurs avec AgendaDate (agendaDates).Swift coreData - date au format et l'utiliser dans le prédicat

dans mon agendaDate j'ai un objet dates (de type Date).

J'utilise un prédicat comme ceci:

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

Je suis en train de formater les dates d'avoir ceci:

"dd MM yyyy" au lieu de « aaaa mm jj hh: mm: ss "

J'ai besoin de comparer dans le prédicat deux dates mais sans le temps? est-ce possible?

MISE À JOUR ----- Voici ma fonction mis à jour comme vous l'avez suggéré:

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 
} 

et voici la fonction qui doit configurer la cellule et ne prendre que les événements qui ont la même date de la date sélectionnée :

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

Etes-vous en train de dire cette date dans les données de base a hh: mm: ss et vous voulez qu'il supprime en comparant dans le prédicat? –

+0

@SandeepBhandari oui exactement. Dans les données de base est également stocké avec le temps. Quand je l'utilise dans le prédicat pour le comparer je voudrais que la date soit sans le temps – Marco

+0

@SandeepBhandari :) Merci! – Marco

Répondre

0

N'utilisez pas un format de chaîne personnalisé à cette fin. Vous voulez récupérer toutes les entrées qui sont liées à un objet Agendadate avec une date le même jour que le jour donné.

Vous calculer le début et la fin de ce premier jour:

let date = Date() 

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

Ensuite, utilisez cette sous-requête:

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

Il teste $a.dates >= startDate AND $a.dates < endDate pour tous objets liés, et les rendements vrai s'il y a au moins un correspondant la condition.

+0

Merci pour votre réponse. Je n'ai probablement pas vraiment compris. Ce que j'essaie de faire est d'ajouter dans un tableau tous les AgendaEvent qui ont un agendaDate spécifique. Donc, fondamentalement, je choisis une date. Si la date correspond à une date qui est présente dans agendaDate, alors je voudrais stocker ces AgendaEvent dans le tableau. Peut-être que je fais quelque chose de mal, mais si j'ajoute votre solution que cela prend tout le AgendaEvent. Je vais modifier ma question pour que vous puissiez voir mon code. Merci – Marco

+0

@Marco: Mon prédicat suggéré devrait le faire. J'ai remarqué que dans votre code, l'affectation des prédicats est commentée: '// fetchRequest.predicate = ...', donc tous les objets objectés sont récupérés. –

+0

Désolé .... faute de frappe. J'ai commenté l'ancien. Dans le code, le vôtre est déclenché – Marco