2010-08-19 2 views
2

J'ai une sorcière entité "événement" contient deux propriétés: la date (NSDate) et répétition (NSInteger - 0 = NONE, 1 = TOUS LES JOURS, 2 = HEBDOMADAIRE, 3 = Mensuelle, ...).NSPredicate avec NSDate et se répète (comme l'application Calendrier)

Est-ce que quelqu'un sait comment filtrer des événements en répétant une date?

Exemple:

Premier événement: 01-01-2010/semaine
Deuxième événement: 10-02-2010/mois
Date actuelle: 10-06-2010

Demande:
Obtenez tous les événements où Event.date == "date" OU Event.date.day == "date" .j si Event.repeat == mensuel

événement retourné:
Deuxième événement

J'espère que quelqu'un comprend ce que je suis en train d'expliquer: s

Répondre

0

Je ne suis pas certain que ce peut être fait au niveau de SQLite. Cela peut certainement être fait une fois que vos événements sont mis en mémoire, mais cela, je le soupçonne, va à l'encontre de votre objectif.

Il pourrait y avoir un moyen intelligent pour dénormaliser les données et créer ainsi une situation qui peut être filtrée.

Par exemple, si vous aviez le jour du mois et le mois a sorti dans les champs entiers que vous pourriez être en mesure de trouver un moyen de déterminer, en fonction si les choses les aligner. Cela ne me vient pas directement, mais je chercherais certainement dans cette direction une solution.

Une autre alternative, qui ont tendance à utiliser des calendriers, est de créer des événements dépendants des dates à venir. Lorsque l'événement est créé, vous créez tous les événements dépendants de sorte que vous filtrez simplement une date. Nasty pour être sûr.

La dernière option consiste à mettre tous les événements en mémoire et à calculer à partir de là.

+0

Merci pour votre réponse. Je cherchais le meilleur moyen de le faire et me demandais si c'était possible avec un "simple" nspredicate. – Manhuman

2

Le problème ici est que NSDate ne dispose pas d'un day (ou tout autre similaire) propriété. Si c'est le cas, votre prédicat fonctionnerait comme écrit.

La programmation des données et de l'heure est complexe sous le capot. Par exemple, dans l'usage courant, l'expression "même date" signifie le même jour calendrier. Cependant, du point de vue des codes, cela signifie également la même semaine, le même mois et l'année, car les jours ne sont pas plus significatifs pour le code que toute autre division arbitraire du calendrier. Même dans un usage ordinaire, "jour" peut se référer à une plage spécifique d'heures, par ex. Samedi, 21 août 2010 ou il peut se référer à toute plage arbitraire de 24 heures comme dans "un jour". Lequel avez-vous besoin pour cette application?

NSDate est vraiment une enveloppe d'objet autour d'un horodatage précis de microseconde. Il dispose de méthodes de conversion en chaînes et de création et de comparaison d'horodatages, mais ne comprend pas les attributs de calendrier tels que les secondes, minutes, heures, jours, semaines, mois ou années. C'est ce à quoi sert NSCalendar et les données de base ne supportent pas intrinsèquement cette classe en tant que type de données, car cela serait complexe pour tous les calendriers possibles.

Si les attributs de calendrier sont nécessaires dans un modèle, vous devez créer une entité personnalisée qui modélise une date de calendrier. Définissez les attributs d'entité sur les attributs de calendrier dont vous avez besoin pour modéliser, puis une relation avec l'objet qui a besoin de la date du calendrier en tant que propriété, par exemple.

CalendarDate{ 
    date:NSDate 
    minute:int 
    hour:int 
    day:int 
    month:int 
    year:int 
    events<--(required,nullify)-->>Event.date 
} 

Vous pouvez créer une classe personnalisée pour l'entité et de fournir une méthode qui renseigne automatiquement l'objet en fonction du passé NSDate et un calendrier que vous choisissez.

Maintenant, votre prédicat est facile.

NSPredicate *myPred; 
myPred=[NSPredicate predicateWithFormat:@"(date.date==%@ or date.day==%i) AND repeat=%i", currentDate, 45, kMonthly]; 

Cela semble être gênant, mais il est nécessaire en raison de la véritable complexité des dates du calendrier. Il n'existe tout simplement pas un moyen facile de gérer les calculs de date et d'heure et les comparaisons pour tous les usages.

+0

Merci beaucoup pour votre réponse, votre solution semble être vraiment bonne. – Manhuman