2012-02-08 4 views
2

コア日付オブジェクト(約10000)の大きなプールがあり、プロファイルに応じてコードを実行するのに時間がかかりすぎます: NSDate * maxExternalChangedDate = [codes valueForKeyPath: @ max.externalChangedDate "]; コミュニティはそれを見つけた方が良い方法を知っていますか? NSFetchRequestを使用し、あなたがMAX()と分()などの関数の結果をyeildするNSExpressionDescriptionを使用することができますNSDictionaryResultType戻すことによりコアデータオブジェクトの大きなプール内で最大日付を見つけるより良い方法

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"]; 

答えて

3

。アップル

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

0

私は同じ問題を持っています。

これはうまくいくはずですが、私にとってはそうではありませんでした。 いくつかの理由により、データベースが壊れているというエラーでクエリがクラッシュします。

最後に私はフィールドDESCENDINGを注文し、setFetchLimを使用してクエリを実行しました。その完璧ではないが、少なくともそれは働いた。

また、私が使用するフィールドにはインデックスがあることを確認しました。 私はレコードが少ないので、これは問題なく動作します。 30000レコードでは問題になるかもしれません。

私はIOSのドキュメンテーションに従い、 "max:"クエリを実行したが、 "データベースが壊れました"というエラーしか表示しませんでした。それは、Appleのサンプルコードが間違って失敗することです。

インターネットをグーグルで見ると、setPropertiesToFetchの呼び出しがIOS 5+で失敗するように見えますか? 私はそれを回避する方法を見つけていません。

通常のクエリを使用すると問題なく動作します。 私はAppleのコードはもはやcorerctではないと結論づけなければなりません。

関連する問題