objective-c - 用于比较核心数据属性的月份部分的谓词

标签 objective-c core-data nspredicate nsfetchedresultscontroller nsmanagedobject

目前,我的部分有一个 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/

相关文章:

ios - 核心数据不支持 ALL 和 IN 谓词

objective-c - 将 ivars 添加到 NSManagedObject 子类

ios - 你如何构造 NSFetchRequest setHavingPredicate :? 的谓词

ios - 使用nspredicate来获取具有最大属性值以及与一种关系的实体

objective-c - 如何使用 NSPredicate 按相关性对搜索结果进行排序?

objective-c - 如何在 NSDictionary 中保存(和检索) NSAttributedString

javascript - 将数据传递到 ios 8 中的 webview

ios - UIViewController 应该控制 UIView 的动画吗?

ios - 在 iOS 中打开另一个应用程序

ios - 使用Core Data和Ensembles(iCloud)删除几乎重复的副本