【发布时间】:2014-08-02 13:53:15
【问题描述】:
我想根据存储属性的 (NSDate) 月份执行谓词。 我知道比较开始日期和结束日期(手动设置)允许这样做。
但我觉得托管对象类中的自定义方法也应该相当容易地实现这一点?好吧,我试过了,但我似乎无法通过让谓词触发它来访问一个简单的方法。这有可能吗?
托管对象文件:
.h 文件:
@property (nonatomic,retain) NSNumber *monthOfDate;
-(NSNumber *)monthOfDate;
.m 文件:
@synthesize monthOfDate;
-(NSNumber *) monthOfDate
{
NSDate *date = [self start];
NSDateComponents *components = [[NSCalendar currentCalendar]components: NSCalendarUnitMonth fromDate:date];
NSNumber *month = [NSNumber numberWithInteger:[components month]];
return month;
}
这是我的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"client == %@ AND monthOfDate == %d", clientMO,int 6];
它返回一个错误:keypath monthOfDate not found in entity。我想是因为它不是实际属性?我怎样才能让它被检测到?
更新
上面的 .h 和 .m 文件来自自动生成的 Event 类(NSmanaged 对象)。我可能会稍后将我的自定义代码移动到一个类别,但到目前为止,不需要修改数据库模型。
下面是 FetchedResultsController(在 uiviewcontroller 类中)设置,其中提到了谓词:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortfix = [[NSSortDescriptor alloc]initWithKey:@"timeStamp" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortfix,nil]];
[fetchRequest setFetchBatchSize:20];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"client == %@ AND monthOfDate == %d", clientMO,int 6];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext sectionNameKeyPath:sectionKeyPathProperty
cacheName:nil];
//sectionKeyPathProperty is a variable that let's me choose one of multiple transient properties I have created for creating relevant sections.
self.fetchedResultsControllerClient = theFetchedResultsController;
_fetchedResultsControllerClient.delegate = self;
return _fetchedResultsControllerClient;
【问题讨论】:
-
这可能不是答案:但你的谓词的第二个参数,应该是:monthToDate == .... 并且只使用 int 6。
-
你是对的,多次重新输入的一个错字:) 程序没有达到这一点,第二次触发 monthToDate 它给出了错误。
-
使用完整的 FRC 更新代码以增加便利性。
标签: ios core-data nspredicate nsfetchedresultscontroller nsmanagedobject