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を使用して、フェッチを問題として特定しましたか?(特にiOSでCDアプリをより高速に実行するための標準的な方法は、より単純な述語を使用してより多くのデータをフェッチすることです。次に、RAM内のアイテムに対するset操作を使用してクエリを絞り込みます。)

考えてみると、その理由がわかります。行はディスク上の連続したバイトに格納されます。行は、同じディスクブロックで頻繁に見つかります。したがって、1回のフェッチで多くの行を取得できる可能性があります。ディスクフェッチは、データベースクエリの遅い部分です。iOSでは、フラッシュは非常に遅いです。高性能のスキャッターギャザーデータベース操作用には設計されていません。IOW、iOSデバイスはそうではなく、独自のOS用のSSDです。ところで、フラッシュでのフェッチは、128k〜256kバイト以上をバッファに取り込みます。したがって、より多くの行を取得するのは簡単で、比較的高速です。

上記のコードは基本的に正しいです。

CoreDataの障害に関するドキュメントを読む必要があります。これは、システムの基本的な概念です。Appleのドキュメントは、障害の性質について非常に明確です。Stack Overflowは、システムのドキュメントで十分にカバーされている基本情報を要求するのに間違った場所です。

アンドリュー

于 2012-04-01T14:08:57.917 に答える