如何翻译SQL:
select sum( field1 * field2 ) from table where field3 = 8
等效的CoreData NSPredicate代码,好吗?是不是可以取出所有内容并运行一个丑陋的for循环?
答案 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"];