Core data 限制UITableView行中显示的核心数据实体

Core data 限制UITableView行中显示的核心数据实体,core-data,uitableview,nspredicate,nsfetchedresultscontroller,Core Data,Uitableview,Nspredicate,Nsfetchedresultscontroller,我想我只是错过了一些明显的东西,但这是一件令人沮丧的事情,不知何故我一直在逃避 我有一个名为ProjectEntry的核心数据实体。ProjectEntry对象显示在UITableView中,使用各种属性,按日期排列(属性包括“dateAsNSDate”[NSDate]、“month”[NSString]、“year”[NSString]、“dayOfWeek”[NSString]) 我正在使用NSFetchedResultsController填充表视图 当我最初创建并保存ProjectEnt

我想我只是错过了一些明显的东西,但这是一件令人沮丧的事情,不知何故我一直在逃避

我有一个名为ProjectEntry的核心数据实体。ProjectEntry对象显示在UITableView中,使用各种属性,按日期排列(属性包括“dateAsNSDate”[NSDate]、“month”[NSString]、“year”[NSString]、“dayOfWeek”[NSString])

我正在使用NSFetchedResultsController填充表视图

当我最初创建并保存ProjectEntry对象时,“dateAsNSDate”属性被解析并转换为各种NSString。一个字符串(也是一个属性)称为“concatMonthAndYear”。它需要“月”和“年”字符串并将它们连接起来。所以我得到了诸如“2014年1月”、“2015年2月”之类的东西

我使用“concatMonthAndYear”作为我的cell.textLabel.text字符串显示在我的tableview单元格中

我使用NSDate属性对tableview行(sortDescriptor)进行排序,并使用“年”属性作为我的节标题(sectionNameKeyPath)

现在,我有一个名为“2014”的tableview部分,其中tableview行表示一个核心数据对象,在该部分中命名为“2014年1月”、“2014年2月”等

我可以点击其中一行,转到另一个tableview,然后列出2014年1月创建的所有对象,例如,在第二个tableview上使用NSPredicate

但是,在我的第一个tableview中,创建的每个核心数据对象都由它自己的tableview行表示。因此,我会得到多行,读“2014年1月”或“2015年5月”或其他任何内容。它们是有效的保存对象,我需要它们,但如果“concatMonthAndYear”已经存在,我想阻止创建新行。如果“2014年1月”已存在,我不希望创建新行。我希望存储新的核心数据对象,而不是代表它的新tableviewrow。例如,我只需要一行“2014年1月”就可以进入一个表,列出2014年1月以来的所有实体

我知道如何使用NSPredicate将2014年1月的所有对象放入第二个表中,但如何仅将一个对象放入第一个表中

NSPredicate不是用于此目的的合适设备吗?我是否应该以某种方式阻止在UITableView委托方法中创建新单元格?每个tableview行都应该是唯一的,并且我一直无法确定是应该使用NSFetchedResults控制器还是tableview委托方法来处理它

还是其他方式

有人能指出正确的方向吗

编辑以包含代码:

-(无效)setupFetchedResultsController
{
//1-决定哪个实体
NSString*entityName=@“项目条目”;
NSLog(@“为名为%@的实体设置获取结果控制器”,entityName);
//2-请求实体
NSFetchRequest*request=[NSFetchRequest fetchRequestWithEntityName:entityName];
[request setReturnsDistinctResults:是];
[请求setResultType:NSDictionaryResultType];
[请求setPropertiesToFetch:@[@“MonthyearTablesHeader”,@“year”];
//3-过滤它
//request.predicate=[NSPredicate predicateWithFormat:@'';
//4-排序
request.sortDescriptors=[NSArray arrayWithObjects:[NSSortDescriptor SortDescriptor WithKey:@“年”
(没有),,
[NSSortDescriptor SortDescriptor With Key:@“dateAsNSDate”
上升:是的
选择器:@selector(localizedCaseInsensitiveCompare:)],nil];
//5-取回
self.fetchedResultsController=[[NSFetchedResultsController alloc]initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@“年”
cacheName:nil];
[自执行蚀刻];
}
您可以使用

[FetchRequestSetReturnsDistinctResults:YES];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest SetPropertiesTotch:@[@“concatMonthAndYear”,@“year”];
这将导致fetch请求返回与“2014年1月”等对象相对应的不同字典对象

但是,您不能使用获取请求控制器的委托方法(听到数据更新)


如果您需要听到更新,我建议您在数据中添加一层间接层,其中
MonthEntry
是一个表示年度月份的对象,并且与
ProjectEntry
有一对多关系,后者是您的普通实体。这样,您可以将fetch请求实体设置为
MonthEntry
,看起来很有趣斯汀。我要测试一下。我会把它标为“解决”“尽快。我建议的代码可以添加到提取请求的构造中。正如我在回答中所说,如果设置提取结果控制器的委托,则不能使用字典返回类型。”。如果需要跟踪更改,则需要使用不同的实体。对。你给我指明了正确的方向。我非常感谢,我将修改这个项目,使之包含第二个实体。这是更好的选择。请记住,当您创建新的
ProjectEntry
对象时,您必须将它们连接到新类型的对象(或创建一个对象,然后连接)。您是否考虑过使用KVC收集操作符进行过滤,例如
distinctUnionOfObjects
?不。老实说,直到您的评论,我才意识到这一点。我开始说真的