Objective c 我该如何处理此NSPredicate代码?

Objective c 我该如何处理此NSPredicate代码?,objective-c,ios,cocoa-touch,core-data,nspredicate,Objective C,Ios,Cocoa Touch,Core Data,Nspredicate,我的信用卡有问题。我有一个名为Entry的核心数据对象,其中包含一个名为creationDate的NSDate。我想将其与我称之为date的变量进行比较 我使用一个NSDate类别来提取这两个对象的单独年份,并使用一个核心数据类别对我的核心数据存储中的所有条目对象执行谓词 [Entry allForPredicate:[NSPredicate predicateWithFormat:@"creationDate.year == %i", date.year]]; 我认为这是错误的,因为它没有

我的信用卡有问题。我有一个名为Entry的核心数据对象,其中包含一个名为creationDate的NSDate。我想将其与我称之为date的变量进行比较

我使用一个NSDate类别来提取这两个对象的单独年份,并使用一个核心数据类别对我的核心数据存储中的所有条目对象执行谓词

[Entry allForPredicate:[NSPredicate predicateWithFormat:@"creationDate.year == %i",  date.year]];
我认为这是错误的,因为它没有给我我期望的结果,反而是一片空白


这哪里出了问题?

我怀疑,核心数据在创建原始数据库调用时可能会包含类别

为您的案例创建两个日期,一个是今年1月1日0:00,另一个是一年后

 NSString *basePredicateString = @"creationDate >= %@ AND creationDate < %@";
 NSPredicate *predicate = [NSPredicate predicateWithFormat:basePredicateString, startDate, endDate];

在这个答案下面的评论中,jbrennan提出,一个范畴确实可以被转换成一个谓词。虽然他适合将集合作为NSArray(他添加了一个到测试项目的链接),但当涉及到核心数据获取请求时,它不起作用——至少我不能让它起作用。我试过了。这是我的测试:

我怀疑,核心数据在创建原始数据库调用时是否可以包含类别

为您的案例创建两个日期,一个是今年1月1日0:00,另一个是一年后

 NSString *basePredicateString = @"creationDate >= %@ AND creationDate < %@";
 NSPredicate *predicate = [NSPredicate predicateWithFormat:basePredicateString, startDate, endDate];

在这个答案下面的评论中,jbrennan提出,一个范畴确实可以被转换成一个谓词。虽然他适合将集合作为NSArray(他添加了一个到测试项目的链接),但当涉及到核心数据获取请求时,它不起作用——至少我不能让它起作用。我试过了。这是我的测试:

@vikingosegundo有正确的答案-不能在谓词中使用类别

如果您理解SQL,请尝试设置以下“启动时传递的参数”

-com.apple.CoreData.SQLDebug 1

这将允许您查看请求生成的SQL。这将帮助您了解如何将编写的谓词转换为SQL



再次按@vikingosegundo编辑-当根据OP的问题与CoreData一起使用时,上述内容适用。

@vikingosegundo的答案正确-不能在谓词中使用类别

如果您理解SQL,请尝试设置以下“启动时传递的参数”

-com.apple.CoreData.SQLDebug 1

这将允许您查看请求生成的SQL。这将帮助您了解如何将编写的谓词转换为SQL



再次按照@vikingosegundo进行编辑当按照OP的问题与CoreData一起使用时,上述内容适用。

我非常确定它可以合并分类方法。至少,在使用
NSFetchedResultsController
NSDate
上的category方法时,我几乎完全做到了这一点,因此,只要类别有
-key
,那么
date.key
就会计算。您使用的谓词是一个普通数组,但它能处理核心数据吗?无论如何,我需要睡觉了,我的城市已经醒了。我明天会试试。我很确定它可以合并分类方法。至少,在使用
NSFetchedResultsController
NSDate
上的category方法时,我几乎完全做到了这一点,因此,只要类别有
-key
,那么
date.key
就会计算。您使用的谓词是一个普通数组,但它能处理核心数据吗?无论如何,我需要睡觉了,我的城市已经醒了。我明天试试。