【发布时间】:2010-12-05 18:11:27
【问题描述】:
我正在开发的程序是“CoreDataBooks”的修改版本,取自 Apple iPhone 示例代码。在“CoreDataBooks”中有一个作者列表,其中一些作者有多本书。设置导航控制器,按作者姓名划分部分。在每个部分中,都有每个作者的书籍列表。
所以我使用了这段代码,并试图制作一个按部分排列的名称列表。我的实体被称为“病人”。每个实体都有属性 myDate 和 myName 以及其他一些属性。我想按 myDate 排列部分,每个部分中都有一个名称列表,所有这些都具有相同的日期。
我在使用 NSFetchedResultsController 方法时遇到了困难。当使用日期选择器创建日期时,它们都有一个时间戳。此时间戳使它们不同,如果您在 sectionNameKeyPath 方法中按 myDate 排序,它们将被放置到单独的部分中。
我在网上进行了相当广泛的搜索,并提出了以下解决方案。您创建另一个瞬态属性,一个 NSString,然后使用它对部分进行排序。这是通过创建一个日期格式化程序来完成的,如下所示。我包括了我的 NSString 的 setter,以及 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”的键值编码”
再次感谢。
【问题讨论】:
-
不要使用“[code]”标签。使用“101010”按钮格式化代码。
标签: iphone core-data ios nsfetchedresultscontroller