我知道我不应该将核心数据视为关系。但是使用SQL查询最容易解释我正在尝试做什么。
我想要做的是从属性约束到实体子节点的最大值。在SQL中类似于:select max(valueY) from graphdata where parentID = 10
我正在做一些类似上面的SQL查询,成功排除where(NSPredicate)部分。
我将NSPredicate添加到我的代码中,认为它会排除不在我正在查看的KPI内的graphdata对象。好吧,猜不是,这不是我所看到的,它似乎根本就什么都不做。
核心数据模型由多个KPI对象组成,每个对象都包含一个GraphData对象数组。每个GraphData对象都包含一个valueX和一个valueY属性。
我想要指定KPI对象的graphdata的最大值Y。
这是我的代码,它基于Apple的核心数据片段之一:
NSManagedObjectContext *context = ...
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:GRAPH_DATA_ENTITY_NAME inManagedObjectContext:context];
[request setEntity:entity];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"ValueY"];
//MY WHERE KIND OF CLAUSE/PREDICATE WHICH ISN'T WORKING?
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"kpiForGraphData == %@", self.kpi];
[request setPredicate:predicate];
// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"max:"
arguments:[NSArray arrayWithObject:keyPathExpression]];
// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxValueY"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSDecimalAttributeType]; // For example, NSDateAttributeType
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Execute the fetch.
NSError *error;
id requestedValue = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil) {
// Handle the error.
}
else {
if ([objects count] > 0) {
requestedValue = [[objects objectAtIndex:0] valueForKey:@"maxValueY"];
}
}
[expressionDescription release];
[request release];
return [requestedValue doubleValue];
到目前为止,我一直试图通过阅读文档,搜索Google和stackoverflow来帮助自己。我似乎找到的所有东西要么选择实体(NSPredicates),要么使用函数选择值。我从未见过做我想做的事情的例子或解释。我喜欢Core Data,但是现在SQL对我来说似乎更直接。