在核心数据对象的大池中找到最大日期的更好方法

时间:2012-02-08 13:51:48

标签: cocoa core-data

我有大量核心日期对象(大约10000个),并且根据配置文件执行代码的时间太长了:     NSDate * maxExternalChangedDate = [代码valueForKeyPath:@“@ max.externalChangedDate”]; 是社区知道找到它的更好方法吗?

NSString *rateSheetID = [rateSheetAndPrefix valueForKey:@"rateSheetID"];
NSFetchRequest *requestCodesForSale = [[NSFetchRequest alloc] init];
[requestCodesForSale setEntity:[NSEntityDescription entityForName:@"CodesvsDestinationsList"
                                           inManagedObjectContext:self.moc]];
[requestCodesForSale setPredicate:[NSPredicate predicateWithFormat:@"(%K.carrier.GUID == %@)",relationshipName,carrierGUID]];
NSError *error = nil; 
NSArray *codes = [self.moc executeFetchRequest:requestCodesForSale error:&error];
if (error) NSLog(@"Failed to executeFetchRequest to data store: %@ in function:%@", [error localizedDescription],NSStringFromSelector(_cmd)); 

NSNumber *count = [codes valueForKeyPath:@"@count.externalChangedDate"];
if (count == 0) { 
    [requestCodesForSale release];
    [pool drain], pool = nil;
    return YES;
}
NSDate *maxExternalChangedDate = [codes valueForKeyPath:@"@max.externalChangedDate"];

2 个答案:

答案 0 :(得分:3)

使用NSFetchRequest并返回NSDictionaryResultType您可以使用NSExpressionDescription来生成max()和min()等函数的结果。

Apple的示例代码

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"salary"];
NSExpression *maxSalaryExpression = [NSExpression expressionForFunction:@"max:"
                                                  arguments:[NSArray arrayWithObject:keyPathExpression]];

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"maxSalary"];
[expressionDescription setExpression:maxSalaryExpression];
[expressionDescription setExpressionResultType:NSDecimalAttributeType];
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];

查看此文档以获取更多信息。

Core Data Programming Guide

答案 1 :(得分:0)

我有同样的问题。

理论上这应该有用,但对我来说却没有。 由于某些原因,查询因数据库损坏的错误而崩溃。

最后我执行了一个查询,我在我的字段DESCENDING上订购,并使用setFetchLim:1。它并不完美,但至少它起作用了。

此外,我确保我使用的字段有一个索引。 由于我的记录很少,这很好用。 在30000条记录中,它可能是一个问题。

我按照IOS文档,ff查找“max:”查询,但只得到“数据库损坏”错误。这是来自Apple的示例代码失败了。

在互联网上搜索,似乎在IOS 5+中调用setPropertiesToFetch失败了! 我没有找到任何方法。

使用普通查询,它没有任何问题。 因此,我必须得出结论,Apple代码不再是核心代码。