gpt4 book ai didi

iphone - CoreData 数学函数

转载 作者:行者123 更新时间:2023-12-03 20:45:34 28 4
gpt4 key购买 nike

我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com