日期排序核心数据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