2011-05-15 70 views
3

我正在使用核心数据;假设我在员工和部门之间有多对一的关系,员工存储在每个部门的NSSet中。我想找到所有只有一名员工的部门。我如何使用核心数据来做到这一点?如何使用NSPredicate基于子元素进行筛选?

我试过下面的代码,我收到一个异常,说MYEmployee没有响应allObjects

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.employees.allObjects.count == 1"]; 
singleEmployeeDepartments = [[myModelController allDepartments] filteredArrayUsingPredicate:predicate]]; 
+0

我上面的代码块都是一行代码。当我尝试使用singleEmployeeDepartments启动下一行时,它会打破Markdown代码。是什么赋予了? – 2011-05-15 03:26:42

+0

反引号仅用于内联代码格式。对于多行代码块,每行缩进4个空格。您也可以选择文本并点击编辑栏或Control-K上方的{}。 – 2011-05-15 05:51:44

回答

7

首先,您不是在这里高效使用Core Data,因为您总是从数据存储中获取所有部门,然后在存储器中筛选结果数组。您可以直接为匹配部门查询托管对象上下文,而不是获取所有部门,这可以减少内存消耗,并且如果您拥有很多部门,也可能会更快。

NSManagedObjectContext *moc = ...; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"Department" inManagedObjectContext:moc]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 1"]]; 
NSArray *singleEmployeeDepartments = [moc executeFetchRequest:request error:NULL]; 

另一个关键部分是使用@count运营商在谓词字符串,以查询有员工的具体数量的部门。

+0

谢谢,它的工作,并感谢您的效率提示。尽管我已经需要为整个数组查询不同的用途。此外,我认为NSSet没有响应计数,但我猜想,因为它在NSPredicate中,它是一个集合函数,它的工作原理? – 2011-05-15 21:48:26

+0

一个简单的问题:在哪里记录@count?这里间接使用https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-CJBDBHCB – mxb 2014-12-12 17:37:05