2009-11-20 4 views
1

J'ai un certain nombre de calendriers, qui ont chacun un certain nombre d'événements. Je voudrais trouver tous les événements pour un calendrier où date> x.Un à plusieurs relations iPhone - NSPredicate base de données requête

Ma signature de la méthode ressemble à ce

-(NSArray*)eventsForCalender:(Calendar*)calender StartDate:(NSDate*)start endDate:(NSDate*)endDate; 

J'ai ajouté un événement à un calendrier comme celui-ci, mais je n'ai pas la moindre idée comment s'y prendre pour construire une NSPredicate pour la requête. Toute aide appréciée

-(Event*)newEventforCalender:(Calendar*)calender 
{ 
    Event * newEvent = (Event*)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:app.managedObjectContext]; 

    NSMutableSet * eventsArray = [calender mutableSetValueForKey:@"Events"]; 
    [eventsArray addObject:newEvent]; 
    [app.managedObjectContext processPendingChanges]; 

    return newEvent; 
} 

alt text http://img4.imageshack.us/img4/5218/screenshot20091120at140.png

J'ai changé le nom de la relation à "événements" et essayé le

suivant
.... 
    NSEntityDescription * entity = [NSEntityDescription entityForName:@"Calendar" inManagedObjectContext:app.managedObjectContext]; 
    [request setEntity:entity]; 

    NSPredicate * predictate = nil; 
    predictate = [NSPredicate predicateWithFormat:@"(name == %@) AND (Event.start > '%@') AND (Event.finish < '%@')", calender.name, start, endDate, nil]; 
    [request setPredicate:predictate]; 
... 

Cependant, je reçois une exception

Mettre fin application en raison de exception non interceptée 'NSUnknownKeyException', raison: '[valueForUndefinedKey:]: cette classe n'est pas une valeur clé codage-conforme pour la clé Event.'

Répondre

4

Quelques réflexions:

  1. Dans votre modèle, est newRelationship vraiment appelé calendar?
  2. Vous souhaitez renommer Events-events suivre les conventions de nommage (entités comme Event et Calendar sont activés, alors que les attributs comme discipline et les relations comme events sont en minuscules)
  3. câbler les calendar et events relations dans les deux sens

Cela dit et fait, vous pouvez utiliser un prédicat comme:

- (NSArray *) eventsForCalendar:(Calendar *)calendar startDate:(NSDate *)startDate endDate:(NSDate *)endDate { 

    NSPredicate *_predicate; 
    NSString *_predicateStr; 
    NSSet *_calendarQueryResults; 

    _predicateStr = [NSString stringWithFormat:@"(name like '%@') AND (event.start > '%@') AND (event.finish < '%@')", calendar.name, startDate, endDate]; 
    _predicate = [NSPredicate predicateWithFormat:_predicateStr]; 
    _calendarQueryResults = [_managedObjectContext fetchObjectsForEntityName:@"Calendar" withPredicate:_predicate]; 

    return [_calendarQueryResults allObjects]; 
} 

Cela fonctionnera si le nom du calendrier est suffisant pour identifier de façon unique un calendrier individuel. Si vous avez deux calendriers avec le même nom, vous devez ajouter un critère de recherche supplémentaire, comme @"(category like '%@') ... ", calendar.category, ...

Vous pouvez également utiliser l'objet ID:

_predicateStr = [NSString stringWithFormat:@"(SELF == %@) AND (event.start > '%@') AND (event.finish < '%@')", calendar, startDate, endDate]; 

est Apple avec justesse une bonne référence pour NSPredicate programmation nommé NSPredicate Programming Guide.

+0

Merci, donc vous devez utiliser (nom comme '% @') vous ne pouvez pas utiliser l'id de l'objet comme référence? –

Questions connexes