具有多个到多个谓词的核心数据

时间:2011-02-25 17:07:13

标签: iphone cocoa core-data nspredicate

对于这样的关系:

TagGroups< ---->>标记和LT;< ---->>对象

对象有标签,标签可以按标签组分组。

我有一个对象,我想知道它的标签所属的所有TagGroup。

为了构造他的谓词,我首先尝试了以下格式字符串:

(SELF是TagGroup)

NSPredicate* p = [NSPredicate predicateWithFormat:@"%@ IN SELF.tags.objects" , object];

这会失败,因为没有遍历Key-ValueCoding。

经过一些研究,我发现了几个解释SUBQUERY的问题

Core Data, try to use NSPredicate to filter a toMany relationship set but get the "to-many key not allowed here" error

Core data to-many NSPredicate with AND

这些似乎是解决方案的一部分,但与这些问题不同,我不测试像“tag.name”这样的值,而是测试集合中的成员资格。

所以考虑到这一点我尝试了这个:

NSPredicate* p = [NSPredicate predicateWithFormat:@"%@ IN SUBQUERY(SELF.tags, $eachTag,$eachTag.object)" , object];

无法解析(我尝试了其他一些变体也未成功)

有关如何正确构建此格式字符串的任何想法?

更新

还从另一个方向尝试了它:

NSPredicate* p = [NSPredicate predicateWithFormat:@"ALL SUBQUERY(%@.tags,$eachTag,$eachTag.tagGroup)" , anObject];

1 个答案:

答案 0 :(得分:0)

如果您“有一个对象”,即您有一个特定的managedObject,其实体为Object,那么您不需要谓词。你只需要走关系keypath。

以下是使用字典实现的示例,它与托管对象的工作方式相同。

NSDictionary *tagGroup1=[NSDictionary dictionaryWithObjectsAndKeys:@"tagGroupOne",@"name",@"tagGroup1",@"theValue",nil];
NSDictionary *tagGroup2=[NSDictionary dictionaryWithObjectsAndKeys:@"tagGroupTwo",@"name",@"tagGroup2",@"theValue",nil];
NSDictionary *tag1=[NSDictionary dictionaryWithObject:tagGroup1 forKey:@"tagGroup"];
NSDictionary *tag2=[NSDictionary dictionaryWithObject:tagGroup2 forKey:@"tagGroup"];

NSSet *tags=[NSSet setWithObjects:tag1,tag2,nil];

NSDictionary *objD=[NSDictionary dictionaryWithObjectsAndKeys:tags,@"tags",nil];
NSLog(@"tagGroup names=%@",[objD valueForKeyPath:@"tags.tagGroup.name"]);
NSLog(@"tagGroup objects=%@",[objD valueForKeyPath:@"tags.tagGroup"]);

......输出:

tagGroup names={(
    tagGroupTwo,
    tagGroupOne
)}

tagGroup objects={(
        {
        name = tagGroupTwo;
        theValue = tagGroup2;
    },
        {
        name = tagGroupOne;
        theValue = tagGroup1;
    }
)}

所以,你真正需要的只是:

NSSet *tagGroups=[anInstanceOfObject valueForKeyPath:@"tags.tagGroup"];

这就是键值编码的力量。

如果您尝试获取与具有特定属性值的Objects有关系的TagGroup,则只需要子查询。