- 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/
按照我目前安排代码的方式,下一行将为各种托管对象上下文运行。一些获取的实体将具有“complededDate”,而其他实体将没有“completedDate”属性。 let task = retrie
我在 import CoreData 的应用程序委托(delegate)中遇到此错误。据我所知,这是因为我将一个项目命名为 coreData。但是我更改了项目的名称,然后将其删除,并且删除了 /Lib
我想将记录保存在数组中并从 CoreData 中删除它们。我尝试过使用 NSCopying 但似乎 copyWithZone 不适用于 NSManagedObject。我真的很困惑,任何帮助将不胜感激
有时我的项目中很少会出现错误(比如每第 100 个请求)。我的一些 CoreData 的请求有 data:我无法使用该数据。我真的不明白为什么会发生这种情况以及如何防止这种行为。 错误数据输出示例:
如果您使用 Xcode 创建一个新项目并告诉它在您创建项目时创建一个 CoreData 模板,则您不需要 #import 在使用 ManagedObjects 的类中。 我已经将 Core Data
我对 SQLCipher 数据库加密和 CoreData 有疑问:当我将持久存储协调器与 SQLCipher 一起使用时,它总是在第一次应用程序重新启动后因一对多关系故障而崩溃。因此,当我第一次启动该
我有一个想要添加 iCloud 支持的应用程序。此应用程序从服务器加载数据,并将数据存储在 CoreData 中,以便 NSFetchedResultsController可以管理UITableVie
我正在从 coredata 表 STUDENT 中获取数据,并使用 Array 在 tableview 中显示所有学生姓名。在选择任何一个学生姓名后(点击 tableViewCell),它会从另一个表
我在构建过程中收到以下错误。 “API 滥用:尝试序列化非拥有协调器上的存储访问(PSC = 0x7fb5ae208890,存储 PSC = 0x0)CoreData 为什么我的应用程序会出现 Cor
当将 iOS 6.0.1 上的 Core Data 托管对象上下文保存到 SQLite 存储时,我遇到了一个奇怪的“CoreData 不支持持久的跨存储关系”异常。它涉及模型中 Quotes 和 Ab
我的应用程序有两个选项卡栏...每个选项卡栏都将用户带到一个向他显示项目列表的 TableView Controller 。第一个 View 允许用户在数据库中记录条目。另一个选项卡/ View 从数
Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省
我有一个名为visitDate的coredata属性 我想使用单独的选择器相互独立地设置日期和时间。 我意识到,当我设置时间时,我需要获取visitDate的现有日期、月份和年份,但只从NSDateP
我有这个代码示例演示如何更新核心数据中的对象,但是我遇到了一个小问题: // Retrieve the context if (managedObjectContext == nil) { m
我在 CoreData 中有一个包含整数值的列。在从中检索结果时,我希望将列值减去一个数字。 类似于:columnValue - someNumber(此数字由用户输入) 我知道我可能必须为此使用 N
有没有办法将 CoreData 模型文件(即实体描述:*.xcdatamodeld)导出到另一个项目。因为重新创建所有实体很无聊:-) 最佳答案 是的,只需将模型文件本身添加/复制到新项目中,就像任何
我使用核心数据编写了 iPhone 应用程序。当我在模拟器中运行应用程序时,它崩溃并出现以下错误: 2010-02-12 17:24:22.359 CrData[46122:4503] Unresol
我是 CoreData 的新手,在我的 iPhone 应用程序中,我想知道如何保存一些文本,然后将其重新加载。但诀窍是,当 UIDatePicker 中的日期与我相同时加载它。像日历一样保存它。 更新
我正在寻找在 CoreData 中编写一些基本查询的方法,但文档中没有示例。以下是我的查询: 我有一个费用对象,它有一个费用金额字段。 费用可以链接到 ExpenseCategory 对象。 Expe
我在标题中使用“单例”一词时可能存在术语不正确的情况。我现在正在寻找一种好的技术。我有一个名为 user 的实体,它存储用户登录的数据,例如用于发出服务器请求的 session key 。我只希望这些
我是一名优秀的程序员,十分优秀!