如何在iPhone上使用这样的表达式获取获取请求?

时间:2010-06-12 10:37:42

标签: iphone core-data

documentation有一个关于如何仅检索简单值的示例,而不是托管对象。这会记住很多使用别名和函数的SQL只能检索计算值。所以,实际上是非常令人讨厌的东西。要从一堆记录中获取最小日期,请在mac上使用:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" 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:@"creationDate"];

// Create an expression to represent the minimum value at the key path 'creationDate'
NSExpression *minExpression = [NSExpression expressionForFunction:@"min:" 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:@"minDate"];
[expressionDescription setExpression:minExpression];
[expressionDescription setExpressionResultType: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;
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
    // Handle the error.
}
else {
    if ([objects count] > 0) {
        NSLog(@"Minimum date: %@", [[objects objectAtIndex:0] valueForKey:@"minDate"];
    }
}

[expressionDescription release];
[request release];

很好,不过 - 但仔细研究NSExpression -expressionForFunction:arguments:后发现iPhone OS不支持min:功能。

嗯,也许有一种很好的方法可以在iPhone上使用自己的功能来处理这类东西?因为我已经担心的事情是,我将如何排序基于计算出的地图上目标距离的表格(基于位置的内容)。

2 个答案:

答案 0 :(得分:1)

您可以实现自己的功能,然后使用

+ (NSExpression *)expressionForFunction:(NSExpression *)target selectorName:(NSString *)name arguments:(NSArray *)parameters

这将返回一个表达式,该表达式将使用给定的参数返回在给定目标上调用具有给定名称的选择器的结果。

答案 1 :(得分:0)

thnx @dontwatchmyprofile

我刚刚测试了

NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:" arguments:[NSArray arrayWithObject:keyPathExpression]];

似乎在iOS 3.2 SDK中运行良好。