0

Ich baue meine erste App in xcode und versuche, eine Liste der Menschen von kommenden Geburtstagen mit CoreData und NSFetchedResultController abgerufen. Meine Einheit ist Setup alsCoreData sortieren nach anstehenden Geburtstagen

uBirthdays 
-------------- 
NSString uName 
NSDate uBday 

folgt Hier ist meine aktuellen Code:

- (NSFetchedResultsController *)fetchedResultsController { 

if (_fetchedResultsController != nil) { 
    return _fetchedResultsController; 
} 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"uBirthdays" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"uBday" ascending:YES]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

[fetchRequest setFetchBatchSize:20]; 

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"sectionNameGen" cacheName:@"Root"]; 
self.fetchedResultsController = theFetchedResultsController; 
_fetchedResultsController.delegate = self; 

[sort release]; 
[fetchRequest release]; 
[theFetchedResultsController release]; 

return _fetchedResultsController;  

} 

Ist es möglich, dass zu sortieren durch anstehende Geburtstage? Oder müsste ich meine Geburtstage ent-normalisieren, damit ich nur nach Monat und Tag sortieren kann? Jede Eingabe wird sehr geschätzt.

Vielen Dank

Antwort

1

Hier ist, was Sie tun können.

1) Stellen Sie NSSortDescriptors für Ihren uBDay und uName ein, damit Ihre Datensätze zuerst nach Geburtstag, dann nach Namen sortiert werden.

2) Erstellen Sie eine NSPredicate, die alle Geburtstage zwischen [NSDate now] (dh heute zieht) bis zu einem bestimmten Zeitpunkt in der Zukunft (also 30 Tage in die Zukunft = [NSDate dateWithTimeIntervalSinceNow:kOneDayTimeInterval*30])

Beispiel-Code unten:

#define kOneDayTimeInterval 86400 // this is in seconds: 86400 = 1 day 

    - (NSFetchedResultsController *)fetchedResultsController { 
     ... 
     NSSortDescriptor *sortByBDay = [[NSSortDescriptor alloc] initWithKey:@"uBday" ascending:YES]; 
     NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"uName" ascending:YES]; 
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByBDay,sortByName, nil]; 
     [fetchRequest setSortDescriptors:sortDescriptors]; 
     [sortDescriptors release]; 
     [sortByName release]; 
     [sortByReleaseDate release];    
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(uBDay > %@) AND (uBDay <= %@)", [NSDate date], [NSDate dateWithTimeIntervalSinceNow:kOneDayTimeInterval*30]]; 
     [fetchRequest setPredicate:predicate]; 
     ... 
+0

Danke für Ihre Antwort. Da Geburtstage mit Jahren aus der Vergangenheit gespeichert werden, funktioniert das nicht? Wie wenn dein Geburtstag 1983 ist, wird es nie auftauchen? – lostincode

+0

Sie haben absolut Recht! In diesem Fall müssen Sie einige NSDate-Formatierungen vornehmen. Verwenden Sie eine Tabellenansicht, um diese bevorstehenden Geburtstage anzuzeigen und sie in Abschnitte zu gruppieren? – Rog

+0

Ja, es geht in eine Tabellenansicht und ich konnte Abschnitte herausfinden, aber die Sortierung nach "bevorstehenden Geburtstagen" ist, wo ich verloren bin, aufgrund der Tatsache, dass Jahre in der Vergangenheit liegen. – lostincode