2012-01-14 26 views
1

私はCore DataにSQLロジックを適用しようとしているのは確かですが、Appleのドキュメントを読んだ後でも、私は正しいアプローチがまだ分かりません。計算されたプロパティの合計は?

コアデータエンティティの2つの日付プロパティの差を合計するための最良の戦略は何でしょうか?私は "appt"クラスではなく "xcdatamodel"クラスで "numHours"で計算されたプロパティを持っています。以下のコードは、 "エンティティにキーパスが見つかりません"というエラーで失敗します。アドバイスをいただきありがとうございます。 APPTクラスから

- (float)numHours { 
    float hours = ([self.endTime timeIntervalSinceDate:self.startTime] - [self.durationOfBreak intValue])/3600.00; 
    return hours; 
} 

では、実際にはないあなたは、属性に基づいてフェッチすることはできません

"numHours" プロパティ

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"appt" inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 
NSPredicate *datePredicate = [NSPredicate predicateWithFormat:@"date >= %@ && date < %@", self.startDate, self.endDate]; 
[request setPredicate:datePredicate]; 
[request setResultType:NSDictionaryResultType]; 

NSExpression *numHoursPath = [NSExpression expressionForKeyPath:@"numHours"]; 
NSExpression *hoursSum = [NSExpression expressionForFunction:@"sum:" 
                arguments:[NSArray arrayWithObject:numHoursPath]]; 

NSExpressionDescription *debitExpressionDescription = [[NSExpressionDescription alloc] init]; 
[debitExpressionDescription setName:@"totalhours"]; 
[debitExpressionDescription setExpression:hoursSum]; 
[debitExpressionDescription setExpressionResultType:NSDecimalAttributeType]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:debitExpressionDescription]]; 
[debitExpressionDescription release]; 

NSError *error = nil; 
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error]; 

答えて

0

ジェフリーの合計をフェッチする試み、モデル。エラーメッセージ "エンティティにkeypathが見つかりませんでした"と明示的に言います。 SQLite DBをブラウズすることでこれを確認することができ、SQLにクエリする属性がないことがわかります。したがって、フェッチ要求は失敗する必要があります。 NSExpression *numHoursPathは有効な式です。コレクションを取得した後、コレクションに適用することができます。フェッチ要求でそれらを使用することはできません。

アンドリュー

関連する問題