日期排序核心数据NSFetchedResultsController

我正在使用的程序是从Apple iPhone示例代码获取的“CoreDataBooks”的修改版本。 在“CoreDataBooks”中有一个作者列表,其中一些列有多本书。 设置了一个导航控制器,其中各部分按作者姓名划分。 在每个部分中,每个作者都有一个书目清单。

所以我拿了这段代码,试图制作一个按部分排列的名称列表。 我的实体被称为“患者”。 每个实体都有属性myDate和myName以及其他一些属性。 我想安排myDate的部分,每个部分都有一个名称列表,所有这些名称都有相同的日期。

我对NSFetchedResultsController方法有困难。 当使用日期选择器创建日期时,它们都有时间戳。 此时间戳使它们不同,并且如果通过myDate在sectionNameKeyPath方法中进行排序,它们将被放置在单独的部分中。

我在网上进行了相当广泛的搜索,并提出了下面的解决方案。 您创建另一个瞬态属性,一个NSString,然后用它来排序部分。 这是通过创建日期格式化程序完成的,如下所示。 我将我的setter包含在我的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;
}

我得到的当前错误是“实体Patient不是关键字值编码 - 关键字”transactionDay“”

再次感谢。


指定sectionNameKeyPath ,必须包含要应用transient属性的实体属性(即entityAttribute.transientAttribute )。 因此,如果您有一个实体类型为NSDate的属性myDate的实体Patient

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

通过将以下内容添加到顶端,可以在Patient实施文件中定义transient属性:

@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是一个相当庞大的初始化对象,因此可能需要先声明它并稍后参考它以提高效率。


-transactionDay方法应该是您在Patient类上实现的属性,然后可以根据此类(我猜测,该视图控制器)可以选择排序或分区。


听起来像你正试图初始化你的fetchedResultsController与一个sectionNameKeyPath尚未被声明为您的对象模型中的属性患者。

你能否确认transactionDay在Patient对象模型中被定义为NSString属性?

这听起来似乎有点关于你想要实现的一些方法。 也许你应该尝试从你的NSDate属性中删除时间戳呢? 我做了一个快速搜索,因此可以找到这种可能的解决方案来删除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];
}

问题的链接是使用Objective C / Cocoa从NSDate对象中删除时间组件

链接地址: http://www.djcxy.com/p/36119.html

上一篇: date sorting core data NSFetchedResultsController

下一篇: Core Data NSPredicate "deleted == NO" does not work as expected