对于这样的关系:
TagGroups< ---->>标记和LT;< ---->>对象
对象有标签,标签可以按标签组分组。
我有一个对象,我想知道它的标签所属的所有TagGroup。
为了构造他的谓词,我首先尝试了以下格式字符串:
(SELF是TagGroup)
NSPredicate* p = [NSPredicate predicateWithFormat:@"%@ IN SELF.tags.objects" , object];
这会失败,因为没有遍历Key-ValueCoding。
经过一些研究,我发现了几个解释SUBQUERY的问题
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];
答案 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
,则只需要子查询。