1

我有一个名为“Records”的实体,它有一个 NSDecimalNumber 类的名为“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]);

而且我不清楚“故障”是什么意思。

4

1 回答 1

2

以诺,

您怎么知道标准提取速度不足以满足您的需求?您是否使用 Instruments 确定提取是问题?(我问是因为使 CD 应用程序运行得更快的标准方法,尤其是在 iOS 上,是通过使用更简单的谓词来获取更多数据。然后使用对 RAM 中的项目进行集合操作来优化查询。)

如果你想一想,你就会明白为什么。行存储在磁盘上的连续字节中。这些行经常可以在同一个磁盘块中找到。因此,一次提取可能会获得许多行。磁盘获取是任何数据库查询的缓慢部分。在 iOS 上,flash 很慢。它不是为高性能分散收集数据库操作而设计的。IOW,iOS 设备不是自己的操作系统的 SSD。顺便说一句,闪存上的提取会将超过 128k-256k 字节带入缓冲区。因此,获得更多行很容易且相对较快。

您上面的代码基本上是正确的。

您需要阅读有关 Core Data 故障的文档。它是系统中的一个基本概念。Apple 的文档对故障的性质非常清楚。Stack Overflow 是一个错误的地方来询问任何系统文档中涵盖的基本信息。

安德鲁

于 2012-04-01T14:08:57.917 回答