NSPredicate:加入对象或对象ID
问题描述:
上我有一个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] ];
不起作用。
谢谢
答
这听起来像你想要的标签的反比关系。
如果美孚具有一对一关系标签叫tagMember
,其倒数为标签的一对多关系美孚称为fooMembers
,然后得到一组所有的Foo其tagMember
是选择的标签,你会的此操作:
NSSet *setOfFoos = selectedTag.fooMembers;
或者,如果你还没有设立标记一个子类,因此不能使用点语法,你可以这样做:
NSSet *setOfFoos = [selectedTag valueForKey:@"fooMembers"];
(换句话说,由于你已经有了我的物品与您正在查找的对象相关,您可以直接从该项目中获取这些对象,而不是执行提取操作。)
答
对于与父代有关系的给定实体,可以使用依赖于孩子实体本身。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag];
将此谓词应用于父实体的NSFetchRequest。对于1:n关系,您应该得到一个包含0或1个父实体的结果集。
谢谢,但如何看起来NSPredicate这个“查询”?我不想获取标签,也不想导航关系。没有其他办法吗? – mica 2012-02-14 08:06:06
澄清:我想在TableView中使用NSFetchedResultsController。对于大量的项目来说,这不是更好,而不是整个内存? – mica 2012-02-14 08:32:41
您将使用fetchRequest初始化您的fetchedResultsController,以便在显示表之前填充表格。您不希望在该提取中请求特定的对象ID。如果你想一次只填充几个标签,你可以使用谓词,比如'tag.name ==%@'。请参阅FRC类别参考“修改提取请求”。一旦表开始运行并且用户选择了一个标记,就可以从表委托方法中获取选定的标记。在这一点上你不需要另一次获取。 – Wienke 2012-02-14 12:50:11