目前,我的部分有一个 FRC,这些部分是从 transient 属性加载的。
我想让用户限制他看到的内容,例如一个特定的月份。
我在某处读到一个答案,说要添加一个方法,因为谓词调用它,所以我尝试向托管对象类 .m 文件添加一个方法,如下所示:
@property (nonatomic) NSInteger monthOfDate;
@synthesize monthOfDate;
-(NSInteger) monthOfDate
{
NSDate *date = [self theDate];
NSDateComponents *components = [[NSCalendar currentCalendar]components: NSCalendarUnitMonth fromDate:date];
NSInteger month = [components month];
return month;
}
但是当像这样用在谓词中时:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"monthOfDate == %d", 6];
我收到错误:在实体中找不到 Keypath MonthOfDate。
这是否可能,或者我应该在保存日期时将月份作为附加属性?我读了一些建议比较开始日期和结束日期的答案。但用户将能够选择各种自定义日期(一年、一个月、几周、特定的一天),因此这似乎还有很长的路要走。
最佳答案
当您执行获取请求时,谓词充当 SQL 查询,从数据库的表中获取行。这些行尚未“转换”为 Objective-C 对象,因此您添加的方法在那里不可用。该谓词正在查找表中的列,这意味着实体的属性。 您的谓词将在 NSManagedObject 子类的数组上完美运行。
所以你有两个选择:
您可以只获取该实体的每个对象,然后对获取的对象执行该谓词。这并不理想,因为您获取(和存储)的对象比您需要的多,从而浪费了内存。
或者更好的是,向您的实体添加一个附加属性“月份”,在写入数据库时执行您的方法并将月份值作为单独的属性存储在数据库中。然后简单地使用谓词来获取并与该属性进行比较。
关于objective-c - 用于比较核心数据属性的月份部分的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24153070/