2009-09-10 52 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