核心数据实体子属性的最大值

时间:2011-01-20 16:11:48

标签: core-data

我知道我不应该将核心数据视为关系。但是使用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对我来说似乎更直接。

0 个答案:

没有答案