我有大量核心日期对象(大约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"];
答案 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]];
查看此文档以获取更多信息。
答案 1 :(得分:0)
我有同样的问题。
理论上这应该有用,但对我来说却没有。 由于某些原因,查询因数据库损坏的错误而崩溃。
最后我执行了一个查询,我在我的字段DESCENDING上订购,并使用setFetchLim:1。它并不完美,但至少它起作用了。
此外,我确保我使用的字段有一个索引。 由于我的记录很少,这很好用。 在30000条记录中,它可能是一个问题。
我按照IOS文档,ff查找“max:”查询,但只得到“数据库损坏”错误。这是来自Apple的示例代码失败了。
在互联网上搜索,似乎在IOS 5+中调用setPropertiesToFetch失败了! 我没有找到任何方法。
使用普通查询,它没有任何问题。 因此,我必须得出结论,Apple代码不再是核心代码。