2009-10-06 32 views
28

我有一個核心數據模型設置像這樣:如何創建一個基於屬性和關係過濾核心數據對象的NSFetchRequest?

  • 一鳴驚人實體
    • 一對多關係DVD實體。
  • DVD實體
    • 標題屬性(字符串)
    • to-one的父關係大片實體

單個大片可以有它內部有多個DVD(To-Many)。每張DVD只能是單個Blockbuster(To-One)的一部分。

有多個Blockbuster的,有些可能包含與其他Blockbuster的DVD實體共享相同標題的DVD實體。例如,Blockbuster A可能具有「變形金剛2」的副本,並且Blockbuster CBlockbuster G。讓我們假裝沒有Blockbuster擁有同一部電影的多個副本。

我想抓住變形金剛2 DVD從Blockbuster C。我不想從Blockbuster AG的拷貝,因爲我的老闆在那裏經常出現,我只能逃脫燃燒這塊垃圾在Blockbuster C


我的問題是,我該如何形成NSFetchRequest它抓起DVD冠軍「變形金剛2」,這是一鳴驚人「C」父實體的一個孩子?

這種類型的請求將抓住所有的「變2」的DVD,而不是一個具體的大片Ç實體:

NSManagedObjectContext *moc = [self managedObjectContext]; 

NSString *aTitle = @"Transformers 2"; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", aTitle]; 
[request setEntity:[NSEntityDescription entityForName:@"DVD" inManagedObjectContext:moc]]; 
[request setPredicate:predicate]; 

NSError *error = nil; 
NSArray *results = [moc executeFetchRequest:request error:&error]; 

// error handling code 
[request release]; 

有沒有辦法通過,比方說,一個對象ID NSPredicate內部的相關對象,基於這個過濾?

回答

46

您可以在NSPredicate中遍歷關係。例如,你可以寫類似

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster.name LIKE \"Blockbuster C\"", @"Transformers 2"] 

現在,如果你沒有一個屬性來比較,你需要檢查實際的對象,那麼你可以使用類似

[NSPredicate predicateWithFormat:@"title == %@ AND blockbuster IN %@", @"Transformers 2", setOfBlockbusters] 

的完整的語法記錄在here。但是setOfBlockbusters可能是一個集合,一個數組或一個字典(如果它是一個字典,則使用值而不是密鑰)。

+0

非常感謝,做到了!並感謝鏈接到文檔。很有幫助。 :) – 2009-10-06 22:26:47