0

1 つの完全な Core Data プロセスに 2 つの異なるフェッチ リクエストがあることに気付きました。

フェッチ リクエスト A : コンテキスト (MOC) インスタンスは、フェッチ リクエストを作成して実行する (executeFetchRequest) ことにより、ディスクからメモリにデータをフェッチします。

フェッチ要求 B : FRC インスタンスは別のフェッチ要求で初期化され、メモリからメモリ (コンテキストを指定) からデータをフェッチします。これは自動的に行われるため、このフェッチを「実行」する必要はありません。

フェッチ要求 A とフェッチ要求 B の接続

1.A と B のコンテキストは同じでなければならない

2.フェッチ B の結果は、フェッチ A の結果のサブセットです。

質問 私の理解が完全に正しいかどうか知りたいです。不正確な記述や誤解を指摘してください。ありがとう。

サンプルコード

Fetch A (明示的に実行): ディスクからメモリへ

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];   

request.predicate = [NSPredicate predicateWithFormat:@"unique = %@", [flickrInfo 
objectForKey:FLICKR_PHOTO_ID]]; 

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]; 

request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSError *error = nil;

// execute the fetch    
NSArray *matches = [context executeFetchRequest:request error:&error];  

Fetch B (自動): メモリからメモリへ

- (void)setupFetchedResultsController 
{
    NSFetchRequest *request = 
        [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
    request.sortDescriptors = 
        [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"title"
                                                                                     ascending:YES
                                                                                      selector:@selector(localizedCaseInsensitiveCompare:)]];
    request.predicate = [NSPredicate predicateWithFormat:@"whoTook.name = %@", self.photographer.name];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.photographer.managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];
}
4

1 に答える 1

1

フェッチ要求 A. 正解です。

フェッチ リクエスト B。ほぼ正しい。FRC がどこでデータを取得しているか、データがメモリ内にあるか、ストアから取得する必要があるかはわかりません。気にする必要はありません。それが FRC の長所です。

関係 1. 同じコンテキスト。違う。コンテキストは関係とは何の関係もありません。2 つのエンティティ A と B は、コンテキストではなく、同じデータ モデルにある必要があります。コンテキストは、主にフェッチと保存用です。

関係 2. サブセット。違う。エンティティ A をフェッチすると、その関係にアクセスできますが、実際にどの時点でどれだけのデータが取得されているかはわかりません (これを障害と呼びます)。コアデータがそれを処理します。リレーションシップは任意の方法 (1 対多、多対多、1 対 1) で設定でき、空になる可能性があるため、サブセットに関する記述は正しくありません。例えば:

// A --one-to-many--> B
NSSet *bSet = anAObject.bRelationship; 

この場合、セットには実際にすべての B エンティティのサブセットが含まれていますが (他のエンティティがある場合)、これは単なる特殊なケースであることがわかります。上記のコードでは、ドット表記を介して関係エンティティにアクセスできることがいかに便利かを確認することもできます。

于 2012-08-04T10:47:32.337 に答える