2

私はまだ Core Data に頭を悩ませようとしており、SQL を手放すのに苦労しています。それらが同じではないことはわかっていますが、SQL でできることを再現するのは難しいと感じています。誰かが助けてくれることを願っています。

私がやりたいことは、クライアントのリストを作成し、現在の請求額の合計を返すことです。私は2つのエンティティを持っています:

クライアント

  • 名前
  • 住所

請求する

  • クライアント
  • 日にち

2 つのエンティティ間に 1 対多の関係を作成し、NSEntityDescription が Client を指すようにしました。

今、私が SQL 用語で実現したいことは次のとおりです。

SELECT *, SUM(amount) as Total FROM Clients INNER JOIN Billing......"

  • これは 1 つのフェッチ リクエストで実行できますか、それとも 2 つのリクエストを実行してからマージしますか?
  • どうにかして valueForKey: を使用できます@"billing.@sum.amount"か?

  • また、初心者、中級者向けの優れた Core Data ブック (または Web サイト) をお勧めできますか?

4

1 に答える 1

1

これは 1 つのフェッチ リクエストで実行できますか、それとも 2 つのリクエストを実行してからマージしますか?

はい、1回のご依頼で可能です。ここを参照

/*UNTESTED*/
- (NSNumber*) billingSumForClient:(NSManagedObjectID*)clientId
                           context:(NSManagedObjectContext*)context
{
    NSNumber* total = nil;
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Billing"];
    [request setResultType:NSDictionaryResultType];
    NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"amount"];
    NSExpression *sumExpression = [NSExpression expressionForFunction:@"sum:"
                                                            arguments:[NSArray arrayWithObject:keyPathExpression]];
    NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
    [expressionDescription setName:@"total"];
    [expressionDescription setExpression:sumExpression];
    [expressionDescription setExpressionResultType:NSDateAttributeType];
    [request setPredicate:[NSPredicate predicateWithFormat:@"client == %@",clientId]];
    [request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
    NSError *error = nil;
    NSArray *objects = [context executeFetchRequest:request error:&error];
    if (&error) {
        // Handle the error.
    } else {
        if ([objects count] > 0) {
            total = [[objects objectAtIndex:0] valueForKey:@"total"];
        }
    }
    return total;
}

どうにかして valueForKey:@"billing.@sum.amount" を使用できますか?

はい。こちらを参照してください (@Daniel リンク)
すべての請求が現在のコンテキストに既に違反している場合、これはより高速になる可能性があります。

于 2013-04-18T04:21:32.303 に答える