3

EntityA が EntityB と多対 1 の関係を持つコア データ モデルの場合、関連する EntityB の名前で並べ替えられた EntityA オブジェクトのリストを作成したいと考えています。通常、これを行うには、次のようにフェッチ リクエストを設定します。

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

次に、リクエストの値を設定します (この場合、種名でソートされた植物のリストです。種が設定されていない植物もあります)。

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Plant" inManagedObjectContext:self.managedObjectContext];
NSSortDescriptor *sortDescriptorOne = [[NSSortDescriptor alloc] initWithKey:@"species.name" ascending:YES];
NSString *sectionKeyPath = @"species.name";

次に、通常のもので仕上げます。

[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

NSArray *sortDescriptors = @[sortDescriptorOne];
[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:sectionKeyPath
cacheName:@"plantsCache"];

aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

[NSFetchedResultsController deleteCacheWithName:@"plantsCache"];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

return _fetchedResultsController;

しかし、関係はオプションであるため、得られた結果はうまくいきません。したがって、EntityA には EntityB との関係があるものとないものがあります。結果コントローラーは、EntityA のリレーションシップの値が nil の場合に何をすべきかを認識していないようです。

リレーションシップの値を使用してセクションを作成し続け、一部のオブジェクトに nil を許可するためにできることはありますか?

4

2 に答える 2

3

Plant次のように一時的なプロパティを設定します。

-(NSString*)speciesName {
    return self.species ? self.species.name : @"";
}

speciesNameとして使用できるようになりましたsectionNameKeyPath

于 2013-08-23T10:01:03.800 に答える