我目前有一个FRC用于从瞬态属性加载的部分。
我想让用户限制他所看到的内容,例如某个特定月份。
我在某个地方读了一个答案,说要添加一个方法因为谓词调用它所以我尝试将方法添加到托管对象类.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。
这是否可能,或者我应该在保存日期时将月份作为附加属性?我读了一些答案,建议比较开始和结束日期。但是用户可以选择各种各样的自定义日期(一年,一个月,几周,特定的日期),所以这似乎还有很长的路要走。
答案 0 :(得分:2)
执行获取请求时,谓词充当SQL查询,以从数据库中的表中获取行。这些行尚未“转换”为Objective-C对象,因此您添加的方法在那里不可用。谓词在表中查找列,表示实体的属性。 你的谓词可以在NSManagedObject子类的数组上完美地工作。
所以你有两个选择:
您可以只获取该实体的每个对象,然后对获取的对象执行该谓词。这是不理想的,因为你正在获取(并存储)比你需要的更多的对象,从而浪费内存。
或者更好的是,向您的实体添加一个额外属性'month',在写入数据库时执行您的方法并将月份值存储为数据库中的单独属性。然后只需使用谓词进行提取以与该属性进行比较。