2011-05-15 69 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