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