iPhone по дате сортировки основных данных NSFetchedResultsController - PullRequest
1 голос
/ 05 декабря 2010

Программа, над которой я работаю, является модифицированной версией «CoreDataBooks», взятой из примера кода Apple iPhone. В «CoreDataBooks» есть список авторов, у некоторых из которых есть несколько книг. Контроллер навигации настроен, разделы разделены по имени автора. В каждом разделе есть список книг для каждого автора.

Итак, я взял этот код и пытаюсь составить список имен, упорядоченных по разделам. Моя сущность называется «Пациент». Каждая сущность имеет атрибуты myDate и myName, а также несколько других. Я хочу упорядочить разделы по myDate со списком имен в каждом разделе, все из которых имеют одинаковую дату.

У меня возникли проблемы с методом NSFetchedResultsController. Когда даты создаются с использованием средства выбора даты, все они имеют временную метку. Эта временная метка делает их разными, и они будут помещены в отдельные разделы, если вы сортируете по myDate в методе sectionNameKeyPath.

Я провел довольно обширный поиск в Интернете и нашел решение, приведенное ниже. Вы создаете другой переходный атрибут, NSString, а затем используете его для сортировки разделов. Это делается путем создания форматера даты, который показан ниже. Я включил мой установщик для моей NSString, а также метод NSFetchedResultsController.

Любая помощь будет принята с благодарностью.

- (NSFetchedResultsController *)fetchedResultsController {

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

 PatientsAppDelegate*appDelegate=[[UIApplication sharedApplication]delegate];
 NSManagedObjectContext*managedObjectContext=appDelegate.managedObjectContext;

 // Create and configure a fetch request with the Book entity.
 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Patient" inManagedObjectContext:managedObjectContext];
 [fetchRequest setEntity:entity];

 // Create the sort descriptors array.
 NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"myDate" ascending:YES];
 NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"myName" ascending:YES];
 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:dateDescriptor, nameDescriptor, nil];
 [fetchRequest setSortDescriptors:sortDescriptors];

// NSLog(@"%@",myFormattedDate);

 // Create and initialize the fetch results controller.
 NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                        managedObjectContext:managedObjectContext 
                          sectionNameKeyPath:@"transactionDay" 
                             cacheName:@"Root"];
 self.fetchedResultsController = aFetchedResultsController;
 fetchedResultsController.delegate = self;

 // Memory management.
 [aFetchedResultsController release];
 [fetchRequest release];
 [dateDescriptor release];
 [nameDescriptor release];
 [sortDescriptors release];

 return fetchedResultsController;
} 

- (NSString *)transactionDay{
 [self willAccessValueForKey:@"transactionDay"];
 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM dd,yyyy"];
 NSString*someString=[dateFormatter stringFromDate:[self valueForKey:@"myDate"]];
 [self didAccessValueForKey:@"transactionDay"];
 return someString;
}

Текущая ошибка, которую я получаю: «Пациент сущности не соответствует значению ключа для ключа «actionDay» »

Спасибо, еще раз.

Ответы [ 3 ]

1 голос
/ 19 августа 2013

При указании sectionNameKeyPath необходимо включить атрибут сущности, к которому вы хотите применить переходный атрибут (т. Е. entityAttribute.transientAttribute).Поэтому, если у вас есть сущность Patient с атрибутом myDate типа NSDate:

// Create and initialize the fetch results controller.
NSFetchedResultsController *aFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:managedObjectContext 
                                      sectionNameKeyPath:@"myDate.transactionDay" 
                                               cacheName:@"Root"];

Переходный атрибут можно определить в файле реализации Patient, добавив в начало следующее:

@implementation NSDate (TransactionDayFormat)

- (NSString *)transactionDay{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM dd,yyyy"];
    NSString*someString=[dateFormatter stringFromDate:self];
    return someString;
}

@end

@implementation Patient
...

transactionDay будет обрабатывать ваш атрибут myDate в дальнейшем, позволяя вам указывать разделы в более строгих форматах.Обратите внимание, что NSDateFormatter довольно громоздкий объект для инициализации, поэтому может быть целесообразно объявить его раньше и сослаться на него позже для эффективности.

0 голосов
/ 06 декабря 2010

Похоже, вы пытаетесь инициализировать ваш fetchedResultsController с sectionNameKeyPath, который не был объявлен в качестве атрибута в вашей объектной модели для пациента.

Можете ли вы подтвердить, что транзакцияDay определена как атрибут NSString вМодель объекта пациента?

Также это звучит как раунд о том, как идти к тому, чего вы пытаетесь достичь.Возможно, вам следует попробовать удалить метку времени из атрибута NSDate?Я сделал быстрый поиск по SO, и нашел это возможное решение для удаления метки времени NSDate

-(NSDate *)dateWithOutTime:(NSDate *)datDate
    if( datDate == nil ) {
        datDate = [NSDate date];
    }
    NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:datDate];
    return [[NSCalendar currentCalendar] dateFromComponents:comps];
}

Ссылка на вопрос: Удаление компонентов времени из объекта NSDate с использованием Objective C / Cocoa

0 голосов
/ 06 декабря 2010

Метод -transactionDay должен быть свойством, которое вы реализуете в своем классе Patient, и тогда этот класс (контроллер представления, я полагаю) может выбрать сортировку или секцию на основе этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...