具有复杂谓词的 NSFetchedResultsController
NSFetchedResultsController with complicate predicate
我正在使用 UICollectionView
开发应用程序。
它是按日期排列的事件集合。我正在使用 NSFetchedResultsController
从数据库中获取数据。但我需要获取当前和未来的事件 + 2 个过去的事件。
对于 NSFetchRequest
,我使用 NSCompoundPredicate
NSPredicate *nextPredicate = [NSPredicate predicateWithFormat: @"startAt >= %@", [NSDate date]];
NSPredicate *previousPredicate = [NSPredicate predicateWithFormat:@"startAt < %@", [NSDate date]];
NSCompoundPredicate *resultPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: @[nextPredicate, previuosPredicate]];
fetchRequest.predicate = resultPredicate;
而且我不知道如何限制 previousPredicate
只接收 2 件商品。
如果您知道 当前事件 的日期,那么创建一个 return 获取上次事件日期的方法,然后在主 [=] 上设置谓词12=] 到那个日期。
-(NSDate *)dateOfPastEvent{
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:_mainContext];
[request setEntity:entity];
NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"startAt" ascending:NO];
[request setSortDescriptors:@[sortDesc]];
NSError *error = nil;
NSArray *array = [_mainContext executeFetchRequest:request error:&error];
__block NSDate *pastEventDate;
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if ([obj valueForKey:@"startAt"] == currentEventDate) {
if (array.count >= idx+2) {
pastEventDate = [[array objectAtIndex:idx+2] valueForKey:@"startAt"];
*stop = YES;
}
}
}];
return pastEventDate;
}
现在为上面的 returned 日期设置谓词
NSFetchRequest *requestForController = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:_mainContext];
[requestForController setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"startAt >= %@", [self dateOfPastEvent]];
我正在使用 UICollectionView
开发应用程序。
它是按日期排列的事件集合。我正在使用 NSFetchedResultsController
从数据库中获取数据。但我需要获取当前和未来的事件 + 2 个过去的事件。
对于 NSFetchRequest
,我使用 NSCompoundPredicate
NSPredicate *nextPredicate = [NSPredicate predicateWithFormat: @"startAt >= %@", [NSDate date]];
NSPredicate *previousPredicate = [NSPredicate predicateWithFormat:@"startAt < %@", [NSDate date]];
NSCompoundPredicate *resultPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: @[nextPredicate, previuosPredicate]];
fetchRequest.predicate = resultPredicate;
而且我不知道如何限制 previousPredicate
只接收 2 件商品。
如果您知道 当前事件 的日期,那么创建一个 return 获取上次事件日期的方法,然后在主 [=] 上设置谓词12=] 到那个日期。
-(NSDate *)dateOfPastEvent{
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:_mainContext];
[request setEntity:entity];
NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"startAt" ascending:NO];
[request setSortDescriptors:@[sortDesc]];
NSError *error = nil;
NSArray *array = [_mainContext executeFetchRequest:request error:&error];
__block NSDate *pastEventDate;
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if ([obj valueForKey:@"startAt"] == currentEventDate) {
if (array.count >= idx+2) {
pastEventDate = [[array objectAtIndex:idx+2] valueForKey:@"startAt"];
*stop = YES;
}
}
}];
return pastEventDate;
}
现在为上面的 returned 日期设置谓词
NSFetchRequest *requestForController = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:_mainContext];
[requestForController setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"startAt >= %@", [self dateOfPastEvent]];