【问题标题】:NSPredicate with Core DataNSPredicate 与核心数据
【发布时间】:2015-10-06 17:14:52
【问题描述】:

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

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

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

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

这是我的数据模型中在选择公司时处理产品更新的方法。它使用产品视图控制器的标题,因为该属性在 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];
 }

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

再一次,我花了太多时间寻找答案却无济于事。有人会帮助我并解释谓词的正确字符串还是将我引导到正确的文档?

【问题讨论】:

    标签: objective-c core-data nspredicate


    【解决方案1】:

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

    此外,谓词格式为documented。你的问题的简短答案是John 说:使用CONTAINS 而不是LIKE。

    【讨论】:

      【解决方案2】:

      CoreData 中的 SQL LIKE 运算符的半等效项是 BEGINSWITH 用于前缀,ENDSWITH 用于后缀,或 CONTAINS 用于匹配字符串中的任何位置。

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

      您也可以写CONTAINS[cd] 来表示“不区分大小写和变音符号”,或者只写CONTAINS[c]CONTAINS[d]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 2013-05-03
        • 2017-02-20
        • 1970-01-01
        相关资源
        最近更新 更多