Ios 核心数据获取记录按关系分组?

Ios 核心数据获取记录按关系分组?,ios,objective-c,core-data,Ios,Objective C,Core Data,我有两个实体,分别名为费用和费用分类,费用与类别费用具有以下属性- 名称支出类别,目的地-支出分类,反向-支出。 ExpensesCategory有一个名为expenseCography的字符串类型属性,而Expenses有一个名为amount的属性。 现在,我想获取按开支类别分组的开支,其金额为总和。 这是我的密码 NSSortDescriptor *sortTitle =[NSSortDescriptor sortDescriptorWithKey:@"addedTimestamp"

我有两个实体,分别名为
费用
费用分类
费用
类别费用
具有以下属性- 名称支出类别,目的地-支出分类,反向-支出。
ExpensesCategory
有一个名为expenseCography的字符串类型属性,而
Expenses
有一个名为amount的属性。 现在,我想获取按开支类别分组的开支,其金额为总和。 这是我的密码

NSSortDescriptor *sortTitle =[NSSortDescriptor sortDescriptorWithKey:@"addedTimestamp"
                                                               ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortTitle, nil];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense"
                                              inManagedObjectContext:context];

    NSPredicate *predicate;
    predicate =[NSPredicate predicateWithFormat:@"(addedTimestamp <= %@) AND (addedTimestamp >= %@)",currentDate, endDate];
        NSAttributeDescription* amtDescription = [entity.attributesByName objectForKey:@"amount"];
        NSRelationshipDescription* nameDesc = [entity.relationshipsByName objectForKey:@"expenseCategory"];

        NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"amount"];
        NSExpression *countExpression = [NSExpression expressionForFunction: @"sum:"
                                                                  arguments: [NSArray arrayWithObject:keyPathExpression]];
        NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
        [expressionDescription setName: @"Sum"];
        [expressionDescription setExpression: countExpression];
        [expressionDescription setExpressionResultType: NSDecimalAttributeType];

        [fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:amtDescription, expressionDescription, nameDesc, nil]];
        [fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:nameDesc]];
        [fetchRequest setResultType:NSDictionaryResultType];

        [fetchRequest setEntity:entity];
        [fetchRequest setPredicate:predicate];
        [fetchRequest setSortDescriptors:sortDescriptors];
    [context executeFetchRequest:fetchRequest error:&error];
NSSortDescriptor*sortTitle=[NSSortDescriptor sortdescriptor with key:@“addedTimestamp”
上升:是];
NSArray*sortDescriptors=[NSArray数组及其对象:sortTitle,nil];
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
NSEntityDescription*实体=[NSEntityDescription entityForName:@“费用”
inManagedObjectContext:context];
NSPredicate*谓词;
谓词=[NSPredicate谓词格式:@“(addedTimestamp=%@)”,currentDate,endDate];
NSAttributeDescription*amtDescription=[entity.attributesByName objectForKey:@“金额”];
nsrrelationshipsdescription*nameDesc=[entity.relationshipsByName objectForKey:@“ExpenseCegory”];
NSExpression*keypath表达式=[NSExpression表达式forkeypath:@“amount”];
NSExpression*countExpression=[NSExpression expressionForFunction:@“sum:”
参数:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription*expressionDescription=[[NSExpressionDescription alloc]init];
[expressionDescription setName:@“Sum”];
[expressionDescription setExpression:countExpression];
[expressionDescription setExpressionResultType:NSDecimalAttributeType];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:amtDescription,expressionDescription,NameDescription,nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:nameDesc]];
[fetchRequest setResultType:NSDictionaryResultType];
[FetchRequestSetEntity:entity];
[FetchRequestSetPredicate:谓词];
[FetchRequestSetSortDescriptors:sortDescriptors];
[context executeFetchRequest:fetchRequest错误:&错误];
但当我运行时,由于未捕获的异常“NSInvalidArgumentException”,我得到了终止应用程序的
,原因:“传递给setPropertiesToFetch的属性/关系描述名称:必须与fetch实体上的名称匹配

任何帮助都将不胜感激。

您应该看看这项技术。在此url中,您可以找到
员工
部门
之间的示例

希望有帮助

你应该看看这个技巧。在此url中,您可以找到
员工
部门
之间的示例


希望有帮助

您正在将
|expressionDescription |
传递到
setPropertiesToFetch:
,这是一个
NSExpressionDescription
setPropertiesToFetch:
只接受
NSPropertyDescriptions
的数组,因此引发异常


但是,
setPropertiesToGroupBy:
中允许使用
NSExpressionDescription
NSPropertyDescription
setPropertiesToFetch:
表达式描述
传递给
setPropertiesToFetch:
setPropertiesToFetch:
只接受
NSPropertyDescriptions
的数组,因此引发异常


setPropertiesToGroupBy:
中同时允许
NSExpressionDescriptions
NSPropertyDescriptions

以下是您问题的答案

NSEntityDescription *entity = [NSEntityDescription entityForName:@"ExpenseCategory" inManagedObjectContext:context];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];

NSError *error;

fetchRequest.predicate =[NSPredicate predicateWithFormat:@"(addedTimestamp <= %@) AND (addedTimestamp >= %@)",currentDate, endDate];

NSSortDescriptor *sortTitle =[NSSortDescriptor sortDescriptorWithKey:@"addedTimestamp" ascending:YES];
fetchRequest.sortDescriptors  = [NSArray arrayWithObjects:sortTitle, nil];

NSExpressionDescription *ex = [[NSExpressionDescription alloc] init];
[ex setExpression:[NSExpression expressionWithFormat:@"@sum.expense.amount"]];
[ex setName:@"Sum"];
[ex setExpressionResultType:NSDecimalAttributeType];

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"expenseCategory", ex, nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:@"expenseCategory"]];
[fetchRequest setResultType:NSDictionaryResultType ];

// Execute the fetch.
NSArray *matchingObjects = [context executeFetchRequest:fetchRequest error:&error];
if ([matchingObjects lastObject]) {
    for (id expenseCategory in matchingObjects) {
        NSLog(@"%@", expenseCategory);
    }
}
NSEntityDescription*entity=[NSEntityDescription entityForName:@“ExpenseControle”inManagedObjectContext:context];
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
[FetchRequestSetEntity:entity];
n错误*错误;
fetchRequest.predicate=[NSPredicate predicateWithFormat:@“(addedTimestamp=%@)”,currentDate,endDate];
NSSortDescriptor*sortTitle=[NSSortDescriptor SortDescriptor With Key:@“addedTimestamp”升序:是];
fetchRequest.sortDescriptors=[NSArray arrayWithObjects:sortTitle,nil];
NSExpressionDescription*ex=[[NSExpressionDescription alloc]init];
[ex setExpression:[N表达式表达式格式:@“@sum.expense.amount”];
[ex setName:@“Sum”];
[ex setExpressionResultType:NSDecimalAttribute类型];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@“ExpenseCegory”,例如,无]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:@“ExpenseCography”];
[fetchRequest setResultType:NSDictionaryResultType];
//执行提取。
NSArray*matchingObjects=[context executeFetchRequest:fetchRequest错误:&error];
如果([matchingObjects s lastObject]){
用于(匹配对象中的id费用类别){
NSLog(@“%@”,费用类别);
}
}
如果要按Expense addedTime而不是ExpenseControle addedTime进行筛选,请将谓词更改为:

fetchRequest.predicate =[NSPredicate predicateWithFormat:@"(expense.addedTimestamp <= %@) AND (expense.addedTimestamp >= %@)",currentDate, endDate];
fetchRequest.predicate=[NSPredicate predicateWithFormat:@“(expense.addedTimestamp=%@)”,currentDate,endDate];

以下是您问题的答案

NSEntityDescription *entity = [NSEntityDescription entityForName:@"ExpenseCategory" inManagedObjectContext:context];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];

NSError *error;

fetchRequest.predicate =[NSPredicate predicateWithFormat:@"(addedTimestamp <= %@) AND (addedTimestamp >= %@)",currentDate, endDate];

NSSortDescriptor *sortTitle =[NSSortDescriptor sortDescriptorWithKey:@"addedTimestamp" ascending:YES];
fetchRequest.sortDescriptors  = [NSArray arrayWithObjects:sortTitle, nil];

NSExpressionDescription *ex = [[NSExpressionDescription alloc] init];
[ex setExpression:[NSExpression expressionWithFormat:@"@sum.expense.amount"]];
[ex setName:@"Sum"];
[ex setExpressionResultType:NSDecimalAttributeType];

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"expenseCategory", ex, nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:@"expenseCategory"]];
[fetchRequest setResultType:NSDictionaryResultType ];

// Execute the fetch.
NSArray *matchingObjects = [context executeFetchRequest:fetchRequest error:&error];
if ([matchingObjects lastObject]) {
    for (id expenseCategory in matchingObjects) {
        NSLog(@"%@", expenseCategory);
    }
}
NSEntityDescription*entity=[NSEntityDescription entityForName:@“ExpenseControle”inManagedObjectContext:context];
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
[FetchRequestSetEntity:entity];
n错误*错误;
fetchRequest.predicate=[NSPredicate predicateWithFormat:@“(addedTimestamp=%@)”,currentDate,endDate];
NSSortDescriptor*sortTitle=[NSSortDescriptor SortDescriptor With Key:@“addedTimestamp”升序:是];
fetchRequest.sortDescriptors=[NSArray arrayWithObjects:sortTitle,nil];
NSExpressionDescription*ex=[[NSExpressionDescription]