NSPredicate 与核心数据

NSPredicate with Core Data

我查看了苹果文档和 SO,但找不到这个简单的代码。

我会接受我对此类问题的任何反对票,但是谓词字符串是什么 return 给定实体,其中该实体的 属性 等同于给定字符串。

我有公司和产品实体。目前,它们很简单。公司有名称和其他一些属性。产品具有制造商和其他一些属性。

我想获取所有产品,其中产品制造商属性等同于在公司视图控制器中选择的公司名称。

这是我的数据模型中用于在选择公司时处理产品更新的方法。它使用产品视图控制器的标题,因为 属性 在 didSelectItemAtIndexPath 中分配了公司名称。

-(void)updateProducts {

NSFetchRequest *reqProd = [[NSFetchRequest alloc] init];

NSEntityDescription *entProd = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:self.context];

[reqProd setEntity:entProd];

NSString *companyToFilter = self.productsViewController.title;

reqProd.predicate = [NSPredicate predicateWithFormat:@"manufacturer like %@", companyToFilter];

NSError *errorProd = nil;

self.productList = [self.context executeFetchRequest:reqProd error:&errorProd];
 }

问题是这个数组总是 returns 0 个元素。我知道我有一个名为 iPhone 的产品,其制造商是苹果。因此,它一定是生成不准确 SQL 的谓词。

同样,我花了太多时间寻找答案无济于事。有人会帮我解释谓词的正确字符串或指导我找到正确的文档吗?

CoreData 中 SQL LIKE 运算符的半等价物是 BEGINSWITH 用于前缀,ENDSWITH 用于后缀,或 CONTAINS 用于匹配任何地方在字符串中。

[NSPredicate predicateWithFormat:@"manufacturer CONTAINS %@", companyToFilter]

您也可以写CONTAINS[cd]来表示"case and diacritic insensitive",或者只写CONTAINS[c]CONTAINS[d]

谓词与SQL不完全相同,但您可以通过在启动选项中添加-com.apple.CoreData.SQLDebug 1使其输出正在使用的SQL。

此外,谓词格式为 documented. The short answers to your question is as 表示:使用 CONTAINS 而不是 LIKE。