我有一个名为"Records"的实体,它有一个NSDecimalNumber类的名为"amount"的属性。
当然,"记录"还有其他属性,如"名称"、"日期"等等
现在我只需要获取所有"记录"的amount属性来对它们进行汇总,
为了获得更好的性能,我只需要"金额"的值,我不在乎名称或日期。
那我该怎么办呢?
这是我的代码,但我想它们不够专业。
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"TransferRecord"];
request.includesSubentities = NO;
[request setPropertiesToFetch:[NSArray arrayWithObject:@"amount"]];
// [request setReturnsObjectsAsFaults:NO]; // I don't know whether I shoud use this
[request setResultType:NSDictionaryResultType];
NSError *error = nil;
NSArray *temp = [self.fetchedResultsController.managedObjectContext executeFetchRequest:request error:&error];
if (temp) {
// NSDecimalNumber *allTrans = [NSDecimalNumber zero];
// for (NSDecimalNumber *one in [temp valueForKey:<#(NSString *)#>)
NSLog(@"%@",[temp description]);
我也不清楚"缺点"是什么意思。
Eno,
你怎么知道标准的提取速度不够快?您是否已确定使用Instruments进行提取是问题所在?(我之所以这么问,是因为让CD应用程序运行得更快的标准方法,尤其是在iOS上,是通过使用更简单的谓词来获取更多数据。然后,您可以使用RAM中项目的设置操作来优化查询。)
如果你仔细想想,你就会明白为什么。行存储在磁盘上的连续字节中。这些行经常可以在同一个磁盘块中找到。因此,一次提取可能会获得许多行。磁盘提取是任何数据库查询中速度较慢的部分。在iOS上,闪光灯的速度相当慢。它不是为高性能分散收集数据库操作而设计的。IOW,iOS设备不是,SSD用于自己的操作系统。顺便说一句,闪存上的提取将把128k-256k字节以上的字节带入缓冲区。因此,获得更多的行很容易,而且相对较快。
上面的代码基本正确。
您需要阅读有关核心数据故障的文档。这是系统中的一个基本概念。苹果的文档对故障的性质非常清楚。Stack Overflow是一个错误的地方,不适合询问任何系统文档中包含的基本信息。
Andrew