2009-09-10 106 views
2

我有一個「歌」實體和一個「標籤」實體,它們之間有多對多的關係。歌曲可以有多個標籤,一個標籤可以應用於多首歌曲。核心數據:如何檢查多對多關係的存在

我想檢查一首歌是否有與之相關的特定標籤。如果樂曲的標籤與它相關聯,我想在表格視圖中顯示一個複選標記。

對於類似的邏輯,在Apple「TaggedLocations」示例代碼中,進行以下檢查以檢查關係是否存在。

if ([event.tags containsObject:tag]) { 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
} 

這可能是低效的,如果沒有在數據庫中有很多標籤,因爲這將在存儲器中取出所有的人。如果我在這裏錯了,請糾正我。

有沒有更有效的方法來檢查歌曲是否與特定的標籤相關聯,而不是檢查Song.Tags?

回答

5

這實際上很容易做到,如果完全沒有記錄。你想創建一個具有set操作謂詞的獲取請求。如果我們想象您的標記模型有一個名爲tagValue的屬性,則您關心的謂詞是「ANY tags.tagValue =='footag'」

NSString *tagSearch = @"footag"; 

// However you get your NSManagedObjectContext. If you use template code, it's from 
// the UIApplicationDelegate 
NSManagedObjectContext *context = [delegate managedObjectContext]; 

// Is there no shortcut for this? Maybe not, seems to be per context... 
NSEntityDescription *songEntity = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:context]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:songEntity]; 

// The request looks for this a group with the supplied name 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY tags.tagValue == %@", tagSearch]; 
[request setPredicate:predicate]; 

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

[request release]; 
3

您是對的,使用該代碼將檢索整個集合,並且對象比較可能相當複雜,具體取決於對象實體的部分屬性和關係。

無論如何,你無法避免包含的集合比較。可能最好的做法是避免通過要求Core Data僅檢索NSManagedObjectID對象來獲取所有屬性/關係。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Tag" inManagedObjectContext:[self managedObjectContext]]]; 
[fetchRequest setResultType:NSManagedObjectIDResultType]; 

NSManagedObjectID對象被保證是唯一的,所以你可以放心地使用它們來檢查組列入。從性能的角度來看,這應該更有效率。

+0

感謝您的解釋。 恕我直言,它仍然意味着同時獲取並保存所有關聯的標記對象。如果數據庫中有1000個相關標籤會怎麼樣? 在我現在的非核心數據實現中,我有一箇中間連接表來檢查關聯的存在。 核心數據文件說核心數據爲多對多關係中間連接表嗎?有沒有辦法編寫一個謂詞來使用中間連接表屬性,並避免讀取內存中的所有對象? – siasl 2009-09-10 22:57:12

+0

您不能利用中間連接表。它由Core Data內部透明地使用。有一種特殊情況,您可以在其中明確添加介於兩個原始實體之間的第三個中間實體,如Apple「核心數據編程指南」中名爲「關係和獲取屬性」一節中所述,並在此部分中查看在「多對多關係」上。您必須決定您的歌曲/標籤關係是否可以像他們的朋友示例中那樣建模(可能不是)。 – 2009-09-11 09:49:21

+0

Yeah歌曲/標籤並不適合該模型,感嘆! – siasl 2009-09-11 10:04:46