1

私の 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 秒。

4

1 に答える 1

1

NoteをMarkerの「親エンティティ」として定義しました。つまり、MarkerはNoteの「子エンティティ」です。

ここに画像の説明を入力

これは、すべてのMarkerオブジェクトがNoteオブジェクトでもあることを意味します (クラスおよびサブクラスと同じ)。したがって、 Noteエンティティのすべてのオブジェクトを取得すると、 Markerエンティティのオブジェクトも返されます。

この場合、SQLite ファイルにはテーブル ZNOTE が 1 つだけ含まれています。このテーブルには、NoteのプロパティとMarkerの追加プロパティの列があります。

したがって、 MarkerをNoteの子エンティティにする必要が本当にない場合は、「親エンティティ」を「親エンティティなし」に設定します。

于 2013-01-04T22:51:02.563 に答える