2014-02-28 108 views
9

基本上,我的数据模型中有3个实体:品牌,模型和修剪。核心数据谓词:谓词未实现SQL生成

  • 品牌与模型之间存在一对多的关系,称为“模型”。 (一个品牌有多个型号,但一个型号只有一个品牌)
  • 一个模型与Trim称为“修剪”具有多对多的关系。 (一个模型可以有多个修剪,一个修剪可以有多个模型)

有一个修剪对象数组,这个数组。

因此,这里是我的读取请求断言:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Brand"];  
[NSPredicate predicateWithFormat:@"ANY models.trims IN %@", arrayOfTrims]; 

,这里是我得到的错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (ANY models.trims IN {<Trim: 0x8e60340> (entity: Trim; id: 0x8e62f10 <x-coredata://BCD28560-AED5-4409-9A35-1925001773E6/Trim/p8> 

我有点新核心数据和我没有想法我做错了什么。

希望有人能帮忙,

非常感谢。

回答

25

“ANY”的核心数据谓词仅适用于一个一对多的关系。 由于您的查询涉及一对多的关系,你必须使用一个子查询:

[NSPredicate predicateWithFormat:@"SUBQUERY(models, $m, ANY $m.trims IN %@)[email protected] > 0", 
    arrayOfTrims]; 
+0

感谢它的作品;)! – Ticko

+0

@Ticko:不客气! –

+3

@MartinR,我通常访问stackoverflow与假设我会找到答案。有了这个特殊的问题,在过去有限的CoreData谓词成功的情况下,我的期望值最低。在这样的背景下,我很震惊地看到你的解决方案解决了我的问题。感谢您花时间发布它。 –

4

当您在CoreData操作中使用谓词时,谓词会被转换为SQL。对于所有NSPredicate操作来说,这种翻译是不可能的,你已经击中了一个不是。我的建议是沿着线的东西:

NSMutableArray* predicates = [NSMutableArray new]; 
for(NSString* trim in arrayOfTrims) 
{ 
    [predicates addObject:[NSPredicate predicateWithFormat:@"%@ IN models.trims", trim]]; 
} 
NSPredicate* predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; 
+1

刚刚尝试过,并得到几乎相同的错误: ***终止应用程序,由于未捕获的异常'NSInvalidArgumentException',原因:'未实现的SQL生成谓词:(<修剪:0x1700a6c00>(实体:修剪; ... IN models.trims)' – Ticko

4

关键字IN可以使用,但你不能在同一时间,任何适用的你的时候没有意义把它变成SQL。

你最有可能寻找的谓词是:

[NSPredicate predicateWithFormat:@"models.trims IN %@", arrayOfTrims]; 

但是,这不会在这种情况下工作,或者是因为你是跨关系去。所以,你需要做的是扭转整个事情:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Model"]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"trims in %@", arrayOfTrims]]; 

NSError *error = nil; 
NSArray *modelArray = [moc executeFetchRequest:request error:&error]; 
if (!modelArray) { 
    NSLog(@"Error: %@\n%@", [error localizedDescription], [error userInfo]); 
} 
NSArray parentObjectArray = [modelArray valueForKey:@"${PARENT_RELATIONSHIP_NAME}"]; 

基本上你是取子对象,以满足您的ANY,然后使用KVC检索您关心的父对象。

+0

这将导致一个数组可能包含重复的'Model'对象。另外,将关键路径“model.brand”添加为预取或性能关系可能会更糟糕。 –

5

如果其中一个谓词使用不存在的列(即字段)名称,也会引发此异常。完全误导性的错误信息...