Сортировка CoreData по предстоящим дням рождения - PullRequest
0 голосов
/ 07 декабря 2010

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

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 голос
/ 07 декабря 2010

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

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];
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...