我想我只是在这里遗漏了一些明显的东西,但这是令人沮丧的事情之一,它以某种方式躲避我。
我有一个名为ProjectEntry的核心数据实体。 ProjectEntry对象以uitableviews显示,使用各种属性,按日期排列(属性包括“dateAsNSDate”[NSDate],“month”[NSString],“year”[NSString],“dayOfWeek”[NSString])。< / p>
我正在使用NSFetchedResultsController来填充表视图。
当我最初创建并保存ProjectEntry对象时,将解析“dateAsNSDate”属性并将其转换为各种NSStrings。一个字符串,也是一个属性,称为“concatMonthAndYear”。它需要“月”和“年”字符串并加入它们。所以我得到了诸如“2014年1月”,“2015年2月”等等。
我使用“concatMonthAndYear”作为我的cell.textLabel.text字符串,以显示在我的tableview单元格中。
我使用NSDate属性对tableview行(sortDescriptor)进行排序,使用“year”属性作为我的section header(sectionNameKeyPath)。
所以现在,我有一个名为“2014”的tableview部分,其中tableview行每个代表一个Core Data对象,在所述部分中命名为“2014年1月”,2014年2月“等等。
我可以点击其中一行,转到另一个tableview,并列出2014年1月创建的所有对象,例如,在第二个tableview上使用NSPredicate。
但是,在我的第一个tableview上,创建的每个Core Data对象都由其自己的tableview行表示。因此,我将获得多行“2014年1月”或“2015年5月”等等。它们是有效的保存对象,我想要它们,但是如果“concatMonthAndYear”已经存在,我想阻止创建新行。如果标题为“2014年1月”的行已存在,我不希望创建新行。我希望存储新的Core Data对象,而不是代表它的新tableviewrow。例如,我只需要一行“2014年1月”,从2014年1月开始列出列出所有实体的表格。
我知道如何使用NSPredicate将所有2014年1月的对象放到第二个表中,但是如何将JUST ONE对象放入第一个表?
NSPredicate不是正确的设备吗?我应该以某种方式阻止在UITableView委托方法中创建新单元格吗?每个tableview行应该是唯一的,而且我是否应该使用NSFetchedResults控制器或tableview委托方法处理它?</ p>
还是其他方式?
有人能指出正确的方向吗?
已编辑包含代码:
- (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];
}
答案 0 :(得分:2)
您可以使用
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:@[@"concatMonthAndYear", @"year"]];
这将导致获取请求返回与&#34; 2014年1月&#34;等对象相对应的不同字典对象。
但是,您无法使用获取请求控制器的委托方法(以听取数据更新)。
如果您需要听取更新,我建议您为数据添加一层间接,其中MonthEntry
是表示年度月份的对象,与ProjectEntry
有一对多的关系,这是你的正常实体。这样,您可以将获取请求实体设置为MonthEntry
。