核心数据多到许多谓词
对于这样一个关系:核心数据多到许多谓词
TagGroups < ---- >>标签< < ---- >>对象
对象具有标签,标签可以是按tagGroups分组。
我有一个对象,我想知道它的标签所属的所有TagGroups。
为了构建他断言,我第一次尝试如下格式的字符串:
(SELF是TagGroup)
NSPredicate* p = [NSPredicate predicateWithFormat:@"%@ IN SELF.tags.objects" , object];
因为集不会运行ALA钥匙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];
如果“有一个对象”,即你有一个特别的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
,则只需要一个子查询。
谢谢,问题是我想构建NSFetchchedResultsController使用的NSFetchRequest。我正在试图做到这一点,所以我不必将所有中间对象都记录到内存中,以便我可以依靠NSFRC处理批处理结果。最后,我最终得到了一个类似你的解决方案,但它并不理想。应该有一种方法来正确构建SUBQUERY来获得结果 – 2011-04-14 15:17:50
如果CoreData能够将SUBQUERY表达式转换为SQL语句,我会感到非常惊讶。虽然我可能是错的。 – 2011-02-25 18:42:50
直到我开始挖掘使用NSFR获取多对多关系的信息时,我才意识到这一点。 – 2011-04-14 15:18:46