Ios Coredata在节中获取和分组对象

Ios Coredata在节中获取和分组对象,ios,core-data,nsfetchedresultscontroller,nspredicate,Ios,Core Data,Nsfetchedresultscontroller,Nspredicate,我正在处理一个相当复杂的对象模型,并且在将一些回迁分解为多个部分以在tableview中显示时遇到了一些问题 我需要将会议管理的对象分组到几个不同的“口袋”中,例如项目、客户机和其他几个。出于几个原因,我决定将这些实现为可以与会议实体关联的标记 因此,我创建了一个新的标记实体,它有一个类型和一个值,并建立了两者之间的关系: Meeting <<-->> Tag 在这种特殊情况下,fetch确实起作用,但不知何故,我得到了意想不到的结果,其中不仅显示了带有valuecli

我正在处理一个相当复杂的对象模型,并且在将一些回迁分解为多个部分以在tableview中显示时遇到了一些问题

我需要将
会议
管理的对象分组到几个不同的“口袋”中,例如项目、客户机和其他几个。出于几个原因,我决定将这些实现为可以与会议实体关联的标记

因此,我创建了一个新的
标记
实体,它有一个类型和一个值,并建立了两者之间的关系:

Meeting <<-->> Tag
在这种特殊情况下,fetch确实起作用,但不知何故,我得到了意想不到的结果,其中不仅显示了带有value
client
标记,还显示了带有value
project
的标记

如果我将谓词更改为
tags.name==“project”
我会得到一个异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'
我可能在这里遗漏了一些基本的东西,诚然,我对谓词没有太多的经验,但苹果关于这个主题的文档还有很多需要改进的地方

作为一个附带的问题,我也不明白为什么我必须在
self.tags.value
中向我的sectionNameKeyPath添加
self
?它有什么作用??在这种情况下,如果不添加它,也会引发异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid to many relationship in setPropertiesToFetch: (tags.value)
最后,在这种情况下,使用获取结果控制器的替代方案是什么?是否会是一组获取请求,我首先获取
Tag
where
name==“project”
的每个实例,然后遍历数组以提取与其关联的会议对象?这似乎效率很低,但目前我所能想到的是,如果你有任何其他想法,我很有兴趣听听

非常感谢您抽出时间

Rog

“苹果关于[NSpreditate]的文档还有很多需要改进的地方”-完全同意

tags.name
无效,因为tags是一个集合,没有对象,有三个


我想您需要类似于
“tags contains%@”、projectTag
的东西,但我不确定语法。可能是
“%@IN%@”、projectTag、thing.tags

问题是
会议
有许多
标记
,因此您需要使用聚合操作:

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:[Meeting entityName] inManagedObjectContext:moc];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY tags.name contains[cd] 'client'"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[fetch setEntity:entity];
[fetch setPredicate:predicate];
[fetch setSortDescriptors:sortDescriptors];
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch 
managedObjectContext:moc 
sectionNameKeyPath:@"clientName"
cacheName:nil];
i、 e.给我一份所有
会议
对象的列表,其中
任何
标签
属于
客户
类型,并按
客户名
对其进行分组。对于
clientName
关键路径,您需要实现一个瞬态属性:

- (NSString *)clientName {
    [self willAccessValueForKey:@"clientName"];

    // Set clientName to the value of the first tag with name 'client'
    NSString* clientName = @"...";

    [self didAccessValueForKey:@"clientName"];
    return clientName;
}

如果您的
NSManagedObject
子类需要
clientName
属性,您可以在一个公共抽象
NSManagedObject
子类中实现它,并使您的具体子类继承它。

谢谢@Nathan de Vries,感谢您花时间回答这个问题。
- (NSString *)clientName {
    [self willAccessValueForKey:@"clientName"];

    // Set clientName to the value of the first tag with name 'client'
    NSString* clientName = @"...";

    [self didAccessValueForKey:@"clientName"];
    return clientName;
}