2010-03-26 39 views
10

因此,可以說我有一個父母子女的商店,父母與子女有一對多的關係(parent.children),他們都有名字。現在,在父母的初始提取中,我可以指定一個排序描述符,按照名字的順序將其返回,但我怎麼才能請求孩子們?如果我做了一個[parent.children allObjects],它只是讓他們陷入混亂中,每次都必須事後排序。核心數據,排序一對多子對象

感謝, 山姆

回答

11

山姆,

如果我讀你的問題正確,要建立一個獲取返回特定父的孩子的排序列表。要做到這一點,我會成立一個爲獲取「孩子們」的實體,然後使用謂詞限制結果:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"children" inManagedObjectContext:moc]]; 
[request setSortDescriptors:[NSArray initWithObject:[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"(parent == %@)", parent]]; 

顯然,你的實體和屬性名稱可能是不同的。在最後一行中,父變量應該是對你想要的子對象的父對象的NSManagedObject實例的引用。

+0

我明白了,你是在暗示運行抓取,而不是僅僅使用coredata的錯?性能不那麼好?即使用謂詞設置提取並運行它比僅執行[parent.children allObjects]並讓managedObject填充錯誤更昂貴? – Shizam 2010-03-26 15:28:56

+0

我認爲你是正確的,運行一個全新的獲取請求將比填寫[parent.children allObjects]錯誤然後排序你得到的NSArray慢。 在我看來,新獲取請求的好處是你可以使用NSFetchedResultsController來保持結果集的更新和排序(即如果你創建了一個新的父子項,它會自動將其插入到結果列表中) 。如果您計劃將孩子的列表保留一段時間並且列表可能會發生變化(即您正在顯示可編輯列表),那麼我會使用此策略。 – 2010-03-26 15:51:47

16

如果你只是想使用一個NSArray,而不是一個NSFetchedResultsController,有另一種方式:

NSSortDescriptor *alphaSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
NSArray *children = [[parent.children allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:alphaSort]]; 
+0

Shosti - 對多對多關係中的'allObjects'調用是否確保該關係中的所有對象都存在故障並且現在在內存中(如果先前不存在)?有時候,父類實體被提取而沒有預先獲取的關係,然後,我們希望所有的子類(可能相關的對象)都存在。我想知道這是否能保證在這種特殊的關係中始終絆倒所有的錯誤。 – idStar 2012-02-16 17:33:20