SQL到核心数据,两个或多个乘法属性的总和

时间:2011-11-13 16:58:34

标签: sql objective-c core-data

如何翻译SQL:

select sum( field1 * field2 ) from table where field3 = 8

等效的CoreData NSPredicate代码,好吗?是不是可以取出所有内容并运行一个丑陋的for循环?

2 个答案:

答案 0 :(得分:2)

为什么需要在SQL中执行?

如果您使用的是NSManagedObject子类,那么您可以创建一个将执行该计算的虚拟属性。 (忽略命名我不知道你的域名)

<强> MyClass.h

@property (nonatomic, readonly) CGFloat sumOfField1AndField2;

<强> MyClass.m

- (CGFloat)sumOfField1AndField2;
{
   return self.field1 * self.field2;
}

答案 1 :(得分:1)

您的实体应具有 fetched property 计算属性,该属性将两个字段相乘。您的查询的解决方案是合并NSPredicate和键值编码:

fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"table"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"field3 = %@", @8];
NSArray *results = [self.managedObjectContext 
       executeFetchRequest:fetchRequest error:nil]; 

NSNumber *sum = [results valueForKeyPath:@"@sum.fetchedProperty"]; 

正如您所指出的,它实际上不是一个获取的属性,而是一个计算字段。我按照这些方针做了一个测试:

// NSManagedObjectSubclass .h
@property (nonatomic, strong) NSNumber *product;

// .m
@dynamic product;

-(NSNumber *)product { 
   return @(value1.floatValue * value2.floatValue); 
}

这很有效:

NSLog(@"Sum of products: %@", [fetchedObjects valueForKeyPath:@"@sum.product"];