核心数据谓词:谓词未实现的SQL生成

基本上我有3个实体在我的数据模型:品牌,模型和修剪。

  • 一个品牌与模型有一个一对多的关系,叫做“​​模型”。 (一个品牌有多个型号,但一个型号只有一个品牌)
  • 一个模型与Trim被称为“修剪”有多对多的关系。 (一个模型可以有多个修剪,一个修剪可以有多个模型)

有一个修剪对象的数组,我想要得到所有的品牌有一个“包含”至less一个修剪包含在这个数组内的模型。

所以这里是我对谓词的判断:

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> 

我对Core Data有点新鲜,我不知道我做错了什么。

希望有人能帮忙,

非常感谢。

核心数据谓词中的“ANY”仅适用于对多关系。 由于您的查询涉及对多关系,因此您必须使用SUBQUERY:

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

在CoreData操作中使用谓词时,谓词会被转换为SQL。 对于所有NSPredicate操作来说,这种翻译是不可能的,你已经击中了一个不是的。 我的build议大致如下:

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

可以使用关键字IN但不能同时应用ANY,因为在将它转换为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来检索你关心的父对象。

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