在iOS的核心数据中只检索实体的一个属性的值



我有一个名为"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

相关内容

  • 没有找到相关文章

最新更新