- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 CoreData 中有一个包含整数值的列。在从中检索结果时,我希望将列值减去一个数字。
类似于:columnValue - someNumber(此数字由用户输入)
我知道我可能必须为此使用 NSPredicate,但我不知道是否有它的函数或语法。
我现在的替代方法是迭代所有列值并用“someNumber”减去。但我认为应该有一种更好、更有效的方法来做到这一点。
<小时/>编辑:来自 @salo.dm 答案的代码
- (NSDictionary *)myFetchResults {
//Predicate works fine
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:pred1, pred2, nil]];
/*Sort Descroptor - Sorting by 4 columns*/
NSSortDescriptor *sortDesc1 = [NSSortDescriptor sortDescriptorWithKey:@"Column1" ascending:YES];
NSSortDescriptor *sortDesc2 = [NSSortDescriptor sortDescriptorWithKey:@"Column2" ascending:YES];
NSSortDescriptor *sortDesc3 = [NSSortDescriptor sortDescriptorWithKey:@"Column3" ascending:YES];
NSSortDescriptor *sortDesc4 = [NSSortDescriptor sortDescriptorWithKey:@"Column4" ascending:YES];
/*Get Data*/
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TableName" inManagedObjectContext:context];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDesc1, sortDesc2, sortDesc3, sortDesc4, nil]];
NSArray *listData = [context executeFetchRequest:fetchRequest error:nil];
/*Create subtract expression*/
NSExpressionDescription *subExp1 = [[NSExpressionDescription alloc] init];
[subExpLatitude setName:@"subtraction1"];
[subExpLatitude setExpression:[NSExpression expressionForFunction:@"from:subtract:"
arguments:[NSArray arrayWithObjects:
[NSExpression expressionForKeyPath:@"Column3"],
[NSExpression expressionForConstantValue:[NSNumber numberWithDouble:someNumber1]],
nil]]];
[subExp1 setExpressionResultType:NSDoubleAttributeType];
NSExpressionDescription *subExp2 = [[NSExpressionDescription alloc] init];
[subExpLongitude setName:@"subtraction2"];
[subExpLongitude setExpression:[NSExpression expressionForFunction:@"from:subtract:"
arguments:[NSArray arrayWithObjects:
[NSExpression expressionForKeyPath:@"Column4"],
[NSExpression expressionForConstantValue:[NSNumber numberWithDouble:someNumber2]],
nil]]];
[subExp2 setExpressionResultType:NSDoubleAttributeType];
/*Get difference data*/
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:subExp1, subExp2, nil]];
NSArray *listDifference = [context executeFetchRequest:fetchRequest error:nil];
NSLog(@"Subtraction 1: %@", [[listDifference objectAtIndex:0] objectForKey:@"subtraction1"]);
NSLog(@"Subtraction 2: %@", [[listDifference objectAtIndex:0] objectForKey:@"subtraction2"]);
NSMutableDictionary *dictResult;
[dictResult setObject:listData forKey:@"Data"]
[dictResult setObject:listDifference forKey:@"Difference"]
return dictResult;
}
<小时/>
编辑:获取 coredata 对象
这不起作用。
NSExpressionDescription *expEntity = [[NSExpressionDescription alloc] init];
[expEntity setName:@"TableNameEntity"];
[expEntity setExpression:[NSExpression expressionForKeyPath:@"objectID"]]; //Searches for a column for the name specified
[expEntity setExpressionResultType:NSObjectIDAttributeType];}
必须将其更改为以下才能使其正常工作(假设这是正确的方法)
NSExpressionDescription *expEntity = [[NSExpressionDescription alloc] init];
[expEntity setName:@"TableNameEntity"];
[expEntity setExpression:[NSExpression expressionForEvaluatedObject]];
[expEntity setExpressionResultType:NSObjectIDAttributeType];
我将 expEntity 添加到 setPropertiesToFetch 列表中。现在我在字典中得到两个值。
{
TableNameEntity = "0x5e22120 <x-coredata://1A659A52-9321-4ACD-992B-04F20E7BDCED/TableNameEntity/p1640>";
subtractionValue = "-24.13";
}
当我尝试从字典中检索和访问 TableNameEntity 时,应用程序崩溃了。
TableNameEntity *tableEntity = (TableNameEntity *)[dict objectForKey:@"TableNameEntity"];
tableEntity.column1 //This is not the exact code. But this operation crashes with error
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSObjectID_48_0 column1]: unrecognized selector sent to instance 0x5e22120'
这里,如果您注意到,键 TableNameEntity 的值包含在引号中,因此我猜它会作为字符串返回。
看看你是否可以纠正我做错的事情。
<小时/>我尝试了另一种方法来获取字典中的列值。就是这样(效果很好)。但我想这不是一个好方法。
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:subExp1, @"column1", @"column2", ... @"columnN" nil]];
最佳答案
您可以在获取请求中进行计算,如下所示:
- (NSArray *)myFetchResults
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"myEntity" inManagedObjectContext:myContext];
request.resultType = NSDictionaryResultType;
NSExpressionDescription *subExDescr = [[NSExpressionDescription alloc] init];
[subExDescr setName:@"subtraction"];
[subExDescr setExpression:[NSExpression expressionForFunction:@"subtract:from:"
arguments:[NSArray arrayWithObjects:
[NSExpression expressionForConstantValue:[NSNumber numberWithInt:someNumber]],
[NSExpression expressionForKeyPath:@"myAttribute"],
nil]]];
[subExDescr setExpressionResultType:NSInteger64AttributeType];
request.propertiesToFetch = [NSArray arrayWithObject:subExDescr, nil];
NSError *err = nil;
NSArray *results = [self.moContext executeFetchRequest:request error:&err];
[request release];
[err release];
return results;
}
获取结果将是一个字典数组。您可以按如下方式访问列中第 n 个值的结果:
NSArray *results = [self myFetchResults];
NSDictionary *nthDict = [results objectAtIndex:n];
NSInteger nthValue = [nthDict objectForKey:@"subtraction"];
请注意,此代码未经测试。按原样,我相信它将对该列中的所有项目进行操作。如果您只想对选定的项目进行操作,可以添加谓词来选择要操作的项目。
您还可以查找 NSExpression 的文档并建立各种不同的操作。该类有点密集,但 Apple 文档中有一些代码片段有助于理解如何使用它。我希望上面的示例说明了如何将其合并到获取请求中。
编辑:更正
当然,必须在获取请求中指定实体。我最初忽略了这一点,但现在更正了代码。
<小时/>编辑:回复评论
我不确定我是否明白你在问什么,但可能就是这样。您可以按如下方式创建表达式描述:
NSExpressionDescription *expLatitude = [[NSExpressionDescription alloc] init];
[expLatitude setName:@"latitude"];
[expLatitude setExpression:[NSExpression expressionForKeyPath:@"Column3"]];
[expLatitude setExpressionResultType:NSDoubleAttributeType];
NSExpressionDescription *expEntity = [[NSExpressionDescription alloc] init];
[expEntity setName:@"TableNameEntity"];
[expEntity setExpression:[NSExpression expressionForKeyPath:@"objectID"]];
[expEntity setExpressionResultType:NSObjectIDAttributeType];}
然后,将它们作为另外两个对象添加到 propertiesToFetch
数组中。获取结果中的每个字典现在都将具有纬度、同一纬度的减法结果以及包含该纬度的实体的相应 objectID。字典将根据您的排序描述符在结果数组中排序。 (我还没有尝试过 objectID 表达式,但我认为它应该可以正常工作。)
基本上,您的结果的排序顺序与具有相同谓词和相同排序描述符的传统提取请求完全相同,即对于具有默认结果类型 NSManagedObjectResultType
的提取请求。
我希望这能回答您的问题。如果没有,请不要犹豫再次询问。但是,我可能需要一段时间才能回答,因为现在是我的 sleep 时间。
<小时/>编辑:响应“获取核心数据对象”
很好地找到了正确的表达式来获取对象 ID! (看来我的表达现在看来显然是错误的。)
至于您遇到的异常,这是有道理的。获取结果中返回的值不是托管对象本身,而只是托管对象的 ID。要访问托管对象,我认为以下应该可行:
NSManagedObjectID *myObjectID = [dict objectForKey:@"TableNameEntity"];
TableNameEntity *tableEntity = (TableNameEntity *)[context objectWithID:myObjectID];
tableEntity.column1
上面的上下文
是NSManagedObjectContext。
但是,我想我更喜欢你的最终解决方案。我不知道您可以将 NSExpressionDescriptions 与propertiesToFetch 数组中的属性结合起来。很高兴知道!
更重要的是,在获取中获取所需的所有属性可能比仅从获取中获取 objectID 并稍后获取属性更快。获取 objectID 通常不会引发实体的故障。我相信稍后当您访问属性时会触发该故障。当访问第一个属性时,它将触发一次,或者多次,每个属性一次。 (我不确定是哪个。)[有关故障的解释,请参阅 Firing Faults .]
我的建议是,最好的方法是在propertiesToFetch 中包含您需要的所有属性。 (如果您愿意,您可以尝试获取 objectID。但是,如果您发现速度很慢,您可以返回获取 fetch 中的所有属性。)
获取请求和表达式的记录很少。你必须稍微尝试一下它们才能得到正确的语法。看来你做得很好。
关于iphone - CoreData 数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8132578/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!