0

Я создаю свое первое приложение в xcode и пытаясь получить список людей, заказанных в ближайшие дни рождения, используя coreData и NSFetchedResultController. Моя сущность настроена следующим образомCoreData сортировать будущие дни рождения

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

Вот мой текущий код:

- (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;  

} 

Является ли это возможно, чтобы разобраться, что к предстоящему дню рождения? или мне придется де-нормализовать мои дни рождения, чтобы я мог сортировать только месяц и день? Любой вход очень приветствуется.

Спасибо

ответ

1

Вот что вы можете сделать.

1) Установите NSSortDescriptors для своих uBDay и uName, чтобы ваши записи были отсортированы сначала по дням дня, а затем по имени.

2) Создать NSPredicate вытягивает все дни рождения между [NSDate now] (т.е. сегодня) до определенного времени в будущем (т.е. 30 дней в будущем = [NSDate dateWithTimeIntervalSinceNow:kOneDayTimeInterval*30])

Пример кода ниже:

#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

Спасибо за ваш ответ. Поскольку дни рождения хранятся с годами прошлого, не будет ли это работать? Например, если ваш день рождения 1983 года, он никогда не появится? – lostincode 2010-12-06 21:52:25

Смежные вопросы