我该如何使用NSPredicate代码?
我在使用NSPredicate时遇到了麻烦。 我有一个名为Entry的核心数据对象,它包含一个名为creationDate的NSDate。 我想将它与我称之日期的变量进行比较。
我正在使用NSDate类别来提取两个对象的单独年份,以及核心数据类别来对我的核心数据存储中的所有Entry对象执行谓词。
[Entry allForPredicate:[NSPredicate predicateWithFormat:@"creationDate.year == %i", date.year]];
我认为这是错误的,因为它没有给我我期望的结果,而是变成空白。
我哪里错了?
我怀疑,Core Data可以在创建原始数据库调用时合并Categories。
为您的情况创建2个日期,一个与今年1月1日在0:00和一年后
NSString *basePredicateString = @"creationDate >= %@ AND creationDate < %@"; NSPredicate *predicate = [NSPredicate predicateWithFormat:basePredicateString, startDate, endDate];
为了完整起见 - 我将如何生成实际年份的开始和结束日期:
NSDate *startDate = [NSDate date]; [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDate interval:NULL forDate:startDate]; NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease]; comps.year = 1; NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:comps toDate:startDate options:0];
编辑
在下面的评论中,这个答案,jbrennan提出,确实一个类别可以被包含在一个谓词中。 虽然他适合作为NSArrays的集合(他添加了一个测试项目的链接),但它在核心数据获取请求时不起作用 - 至少我无法使其工作。 我试过了。 这是我的测试: https : //github.com/vikingosegundo/CoreDataCategoryTest
@vikingosegundo有正确的答案 – 你不能在谓词中使用类别。
如果您了解SQL,请尝试设置以下“ 启动时传递的参数 ”:
-com.apple.CoreData.SQLDebug 1
这将允许您查看请求生成的SQL。 这应该可以帮助您了解您编写的谓词是如何转换为SQL的。
再次编辑 @vikingosegundo – 以上适用于根据OP的问题与CoreData一起使用时。
- 如何使用AWS iOS SDK v2将UIImage上传到S3
- 在forwardPlaybackEndTime之后恢复AVPlayer
- 在nsmutable字典中插入数组中的几个对象
- 如何在iOS自定义键盘中添加自定义通知?
- 从UIImagePickerViewController图像的方形缩略图
- 在@interface之内或之外声明IBOutlet?
- 什么是从autoreleasepool块内设置NSError outparam的正确方法?
- 如何使用NSSetUncaughtExceptionHandler获取未捕获的exception的类,方法和行号
- 在XCode 6.0.1中使用仪器进行性能分析时,应用程序挂起