Bha*_*rat 1 core-data objective-c ios
我命名的两个实体Expenses,并ExpensesCategory在Expenses有关系CategoryExpenses具有以下属性-名称expenseCategory,目的地- ExpensesCategory,逆-费用.它ExpensesCategory有一个名为expenseCategory的字符串类型Expenses的属性,并具有名为amount的属性.现在我想获取由expenseCategory分组的费用和金额总和.这是我的代码
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];
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时我得到了 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attribute/relationship description names passed to setPropertiesToFetch: must match name on fetch entity
任何帮助,将不胜感激.
以下是您的问题的答案.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想要按Expense addedTime而不是ExpenseCategory addedTime进行过滤,则将谓词更改为:
fetchRequest.predicate =[NSPredicate predicateWithFormat:@"(expense.addedTimestamp <= %@) AND (expense.addedTimestamp >= %@)",currentDate, endDate];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5440 次 |
| 最近记录: |