2012-02-13 52 views
0

上我有一个1 coredata数据模型:N的关系NSPredicate:加入对象或对象ID

Entity Item 
Tag *tag; 
.... 

Entity Tag 
NSString *name; 

我想获取项目,女巫有标签的关系。 以下工作:

Tag *selectedTag = ..... 
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Item"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag.name = %@", selectedTag.name]; 

的问题是,有coud是具有相同名称的多个标签。 这些项目不应该被提取。

如何直接比较对象(selectedTag)或至少比较id。

两个:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[tag objectID] == %@", [selectedTag objectID] ]; 

不起作用。

谢谢

回答

1

这听起来像你想要的标签的反比关系。

如果美孚具有一对一关系标签叫tagMember,其倒数为标签的一对多关系美孚称为fooMembers,然后得到一组所有的Foo其tagMember是选择的标签,你会的此操作:

NSSet *setOfFoos = selectedTag.fooMembers; 

或者,如果你还没有设立标记一个子类,因此不能使用点语法,你可以这样做:

NSSet *setOfFoos = [selectedTag valueForKey:@"fooMembers"]; 

(换句话说,由于你已经有了我的物品与您正在查找的对象相关,您可以直接从该项目中获取这些对象,而不是执行提取操作。)

+0

谢谢,但如何看起来NSPredicate这个“查询”?我不想获取标签,也不想导航关系。没有其他办法吗? – mica 2012-02-14 08:06:06

+0

澄清:我想在TableView中使用NSFetchedResultsController。对于大量的项目来说,这不是更好,而不是整个内存? – mica 2012-02-14 08:32:41

+0

您将使用fetchRequest初始化您的fetchedResultsController,以便在显示表之前填充表格。您不希望在该提取中请求特定的对象ID。如果你想一次只填充几个标签,你可以使用谓词,比如'tag.name ==%@'。请参阅FRC类别参考“修改提取请求”。一旦表开始运行并且用户选择了一个标记,就可以从表委托方法中获取选定的标记。在这一点上你不需要另一次获取。 – Wienke 2012-02-14 12:50:11

0

对于与父代有关系的给定实体,可以使用依赖于孩子实体本身。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag]; 

将此谓词应用于父实体的NSFetchRequest。对于1:n关系,您应该得到一个包含0或1个父实体的结果集。