我想我只是遗漏了一些明显的东西,但这是令人沮丧的事情之一,它以某种方式躲避我 .
我有一个名为ProjectEntry的核心数据实体 . ProjectEntry对象以uitableviews显示,使用各种属性,按日期排列(属性包括“dateAsNSDate”[NSDate],“month”[NSString],“year”[NSString],“dayOfWeek”[NSString]) .
我正在使用NSFetchedResultsController来填充表视图 .
当我最初创建并保存ProjectEntry对象时,将解析“dateAsNSDate”属性并将其转换为各种NSStrings . 一个字符串,也是一个属性,称为“concatMonthAndYear” . 它需要“月”和“年”字符串并加入它们 . 所以我得到的东西比如“2014年1月”,“2015年2月”等 .
我使用“concatMonthAndYear”作为我的cell.textLabel.text字符串来显示在我的tableview单元格中 .
我使用NSDate属性对tableview行(sortDescriptor)进行排序,并使用“year”属性作为我的节 Headers (sectionNameKeyPath) .
所以现在,我有一个名为“2014”的tableview部分,其中tableview行每个代表一个Core Data对象,在所述部分中命名为“2014年1月”,2014年2月“等 .
我可以点击其中一行,转到另一个tableview,并列出2014年1月创建的所有对象,例如,在第二个tableview上使用NSPredicate .
但是,在我的第一个tableview上,创建的每个Core Data对象都由其自己的tableview行表示 . 因此,我将获得多行“2014年1月”或“2015年5月”等等 . 它们是有效的保存对象,我想要它们,但是如果“concatMonthAndYear”已经存在,我想阻止创建新行 . 如果 Headers 为“2014年1月”的行已存在,我不希望创建新行 . 我希望存储新的Core Data对象,而不是代表它的新tableviewrow . 例如,我只需要一行“2014年1月”,从2014年1月开始列出列出所有实体的表格 .
我知道如何使用NSPredicate将所有2014年1月的对象都放到第二个表中,但是如何将JUST ONE对象放入第一个表?
NSPredicate不是正确的设备吗?我应该以某种方式阻止在UITableView委托方法中创建新单元格吗?每个tableview行应该是唯一的,我是否应该使用NSFetchedResults控制器或tableview委托方法处理它?
或者其他一些方式?
有人能指出正确的方向吗?
已编辑包含以下代码:
- (void)setupFetchedResultsController
{
// 1 - Decide which Entity
NSString *entityName = @"ProjectEntry";
NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);
// 2 - Request Entity
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
[request setReturnsDistinctResults:YES];
[request setResultType:NSDictionaryResultType];
[request setPropertiesToFetch:@[@"monthYearTableSecHeader", @"year"]];
// 3 - Filter it
//request.predicate = [NSPredicate predicateWithFormat:@" "];
// 4 - Sort it
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"year"
ascending:NO],
[NSSortDescriptor sortDescriptorWithKey:@"dateAsNSDate"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)], nil];
//5 - Fetch
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@"year"
cacheName:nil];
[self performFetch];
}
1 回答
你可以用
这将导致获取请求返回对应于“2014年1月”等对象的不同字典对象 .
However ,您不能使用获取请求控制器的委托方法(以听取数据更新) .
如果您需要听取更新,我建议您为数据添加一层间接,其中
MonthEntry
是表示年度月份的对象,与ProjectEntry
有一对多的关系,这是您的正常实体 . 这样,您可以将获取请求实体设置为MonthEntry
.