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]