核心数据谓词的托管对象中的自定义方法

时间:2014-06-12 09:33:46

标签: ios core-data nspredicate nsfetchedresultscontroller nsmanagedobject

我想根据存储的属性(NSDate)月执行谓词。 我知道比较开始和结束日期(手动设置)允许这样做。

但我觉得Managed Object的类中的自定义方法应该也可以轻松实现这一点吗?好吧,我试过了,但我似乎无法通过让谓词触发它来访问一个简单的方法。这有可能吗?

托管对象文件:

.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。我推测,因为它不是一个真正的属性?我怎样才能让它被发现?

更新

上面的.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;

1 个答案:

答案 0 :(得分:1)

只有当MO已经加载到内存中时才会出现这种情况。 (取出)

在我使用FRC的情况下,情况并非如此,因此我将不得不创建一个单独的月份属性,该属性将保存在MO创建中。

感谢用户Run Loop回答4年前的问题!