私の Core Data アプリには、「メモ」と「マーカー」の 2 つのエンティティがあります。Note エンティティには、マーカーとの 1 対多の関係があります (つまり、1 つのメモには多くのマーカーが含まれます)。すべての「メモ」エンティティのフェッチを担当する fetchedRequestController があります。1 つのメモと 1 つのマーカー (そのメモに属する) を作成した後、fetchedRequestController がマーカーとメモの両方をフェッチするため、エラーが発生します。Note は想定されていますが、Marker はフェッチされません。
これが私の取得したリクエストコントローラーです
TCModel *model = [TCModel sharedModel];
NSManagedObjectContext *context = [model managedObjectContext];
NSParameterAssert(context);
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:context];
NSParameterAssert(entity);
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"Root"];
NSParameterAssert(controller);
self.fetchedResultsController = controller;
controller.delegate = self;
NSError *error;
BOOL success = [controller performFetch:&error];
if ( success == NO )
{
NSLog(@"Failed to fetch!");
NSParameterAssert(nil);
}
オブジェクトは 2 つのヘルパー メソッドを使用して作成され、3 番目のヘルパー メソッドを使用して保存されます。
- (TCNote *)newNote
{
TCNote *note = [NSEntityDescription insertNewObjectForEntityForName:@"Note"
inManagedObjectContext:self.managedObjectContext];
note.creationDate = [NSDate new];
return note;
}
- (TCMarker *)newMarker
{
TCMarker *marker = [NSEntityDescription insertNewObjectForEntityForName:@"Marker"
inManagedObjectContext:self.managedObjectContext];
return marker;
}
- (void)_save
{
NSError *error;
NSLog(@"Saving");
if (![self.managedObjectContext save:&error])
{
NSLog(@"Error saving context: Error = %@", error);
}
}
コンソール出力は次のとおりです。
2013-01-03 17:41:12.062 タイムコード [10269:c07] CoreData: sql: Z_METADATA から Z_VERSION、Z_UUID、Z_PLIST を選択
2013-01-03 17:41:12.063 タイムコード[10269:c07] CoreData: sql: t0.Z_ENT、t0.Z_PK、t0.Z_OPT、t0.ZNOTEDATE、t0.ZSCENEDESCRIPTION、t0.ZSCENETITLE、t0.ZTIMECODEDATE、t0 を選択.ZDATE、t0.ZTITLE、t0.ZPARENT、t0.Z1_PARENT FROM ZNOTE t0
2013-01-03 17:41:12.064 タイムコード [10269:c07] CoreData: 注釈: SQL 接続フェッチ時間: 0.0005 秒
2013-01-03 17:41:12.064 timecode[10269:c07] CoreData: 注釈: 合計フェッチ実行時間: 2 行で 0.0011 秒。