Core data 使用NSExpression组合实体并返回NSArray或NSArray元素
我希望我的Core data 使用NSExpression组合实体并返回NSArray或NSArray元素,core-data,nsarray,nsfetchrequest,nsexpression,Core Data,Nsarray,Nsfetchrequest,Nsexpression,我希望我的UITableViewController的NSFetchRequest根据特定属性对类似记录(实体)进行分组。我目前正在执行一个两步过程,但我相信可能有某种方法可以使用+(NSExpression*)表达式进行聚合:(NSArray*)集合 有人能帮我写下合适的代码吗 下面是返回数组的数组的两步过程的代码: +(NSArray *)getTopQforDogByProgram2:(Dog *)dog inProgram:(RunProgram
UITableViewController
的NSFetchRequest
根据特定属性对类似记录(实体)进行分组。我目前正在执行一个两步过程,但我相信可能有某种方法可以使用+(NSExpression*)表达式进行聚合:(NSArray*)集合
有人能帮我写下合适的代码吗
下面是返回数组的数组的两步过程的代码:
+(NSArray *)getTopQforDogByProgram2:(Dog *)dog
inProgram:(RunProgramTypes)programType
inManagedContext:(NSManagedObjectContext *)context {
NSString *searchString;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Run"];
request.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"dog.callName = '%@'",dog.callName]];
NSSortDescriptor *classSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"runClass" ascending:NO];
request.sortDescriptors = [NSArray arrayWithObject:classSortDescriptor];
NSError *error = nil;
NSArray *dataArray = [context executeFetchRequest:request error:&error];
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
if ( [dataArray count] > 0 ) {
NSMutableArray *pointArray = [[NSMutableArray alloc] init];
for ( Run *run in dataArray ) {
if ( ! [returnArray count] ) {
[pointArray addObject:run];
[returnArray addObject:pointArray];
} else {
BOOL wasSame = FALSE;
for ( NSMutableArray *cmpArray in returnArray ) {
Run *cmpRun = [cmpArray lastObject];
if ( cmpRun.runClass == run.runClass ) {
[cmpArray addObject:run];
wasSame = TRUE;
break;
}
}
if ( ! wasSame ) {
pointArray = [[NSMutableArray alloc] init];
[pointArray addObject:run];
[returnArray addObject:pointArray];
}
}
}
}
return returnArray;
}
您可以使用fetch results控制器为您执行如下分区:
NSFetchedResultsController* controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:@"runClass"
cacheName:nil];
NSMutableArray* sections = [[NSMutableArray alloc] initWithCapacity:[controller sections] count];
for (id<NSFetchedResultsSectionInfo> section in [controller sections]) {
NSMutableArray* sectionCopy = [NSMutableArray arrayWithArray:[section objects]];
[sections addObject:sectionCopy];
}
NSMutableArray* sections = [NSMutableArray new];
NSMutableArray* currentSection = [NSMutableArray new];
for (Run* run in dataArray) {
Run* lastObject = (Run*)[currentSection lastObject];
if (lastObject && (run.runClass == lastObject.runClass)) {
currentSection = [NSMutableArray new];
[sections addObject:currentSection];
}
[currentSection addObject:run];
}