2011-02-25 183 views
2

对于这样一个关系:核心数据多到许多谓词

TagGroups < ---- >>标签< < ---- >>对象

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

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

为了构建他断言,我第一次尝试如下格式的字符串:

(SELF是TagGroup)

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

因为集不会运行ALA钥匙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]; 
+0

如果CoreData能够将SUBQUERY表达式转换为SQL语句,我会感到非常惊讶。虽然我可能是错的。 – 2011-02-25 18:42:50

+0

直到我开始挖掘使用NSFR获取多对多关系的信息时,我才意识到这一点。 – 2011-04-14 15:18:46

回答

0

如果“有一个对象”,即你有一个特别的managedObject其实体是Object,那么你并不需要一个谓语。你只需要走关系的关键路径。

这是一个用字典实现的例子,它与管理对象的工作方式相同。

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"]; 

这就是键 - 值编码的力量。

如果您试图使用特定属性值获取与TagGroup有关系的Objects,则只需要一个子查询。

+0

谢谢,问题是我想构建NSFetchchedResultsController使用的NSFetchRequest。我正在试图做到这一点,所以我不必将所有中间对象都记录到内存中,以便我可以依靠NSFRC处理批处理结果。最后,我最终得到了一个类似你的解决方案,但它并不理想。应该有一种方法来正确构建SUBQUERY来获得结果 – 2011-04-14 15:17:50