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。
我查看了苹果文档和 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。