私が問題を正しく理解しているとすれば、私はこのようにします。 TopEntityに(NSString *)の名前プロパティと(NSString *)データプロパティと(NSInteger)orderプロパティを持つMyEntityとの関係があります。
あなたが与えられた文字列に一致するTopEntityオブジェクトをしたいと言うと、そのMyEntity注文後、あなたはそう....
NSManagedObjectContext *context = [self managedObjectContext];
// Create some top level entities
TopEntity *aTop = [TopEntity insertInManagedObjectContext:context];
aTop.name = @"This is Your Name";
TopEntity *bTop = [TopEntity insertInManagedObjectContext:context];
bTop.name = @"This aint a Name";
TopEntity *cTop = [TopEntity insertInManagedObjectContext:context];
cTop.name = @"This is My Name";
// Add some data
NSInteger i, len = 30;
for(i=0; i<len; i++) {
// Create a new object
MyEntity *entity = [MyEntity insertInManagedObjectContext:context];
entity.orderValue = i;
entity.data = [NSString stringWithFormat:@"This is some data: %d", i];
if(i < 10) {
[aTop addObjectsObject:entity];
[entity addTopObject:aTop];
} else if (i < 20) {
[bTop addObjectsObject:entity];
[entity addTopObject:bTop];
} else {
[cTop addObjectsObject:entity];
[entity addTopObject:cTop];
}
}
// Save the context
NSError *error = nil;
[context save:&error];
// A predicate to match against the top objects
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@", @"This is"];
// A predicate to match against the to-many objects
NSPredicate *secondPredicate = [NSPredicate predicateWithFormat:@"ANY objects.order < %d", 5];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"TopEntity" inManagedObjectContext:context]];
[fetch setPredicate:predicate];
NSArray *result = [[context executeFetchRequest:fetch error:&error] filteredArrayUsingPredicate:secondPredicate];
for(TopEntity *entity in result) {
NSLog(@"entity name: %@", entity.name);
}
ように二つの述語とNSFetchRequestでそれを行うことができ、一定の条件を満たしていることができます
基本的に、フェッチ要求の結果を別の述部で囲み、ANYキーワードを使用するだけで済みます。
私はそれがいかに効率的であるか分かりませんが、この場合はうまくいきます。上記を実行すると「This is Your Name」と表示されます。つまり、最初のTopEntityに一致します。
私は、1つの述語的なフェッチでそれを行うことができることを望んでいましたが、私はそれができないと考え始めています。私は余分なプロパティ - 非正規化 - を使用しているという感覚が、おそらく、パフォーマンス上の賢明な方法です。 –
確かに、オブジェクトごとに検索される1フェッチ要求のアプローチは、検索対象のリストが大量であれば無駄で無駄ですが、小さなリストの場合は合理的なヒットになる可能性があります。私は個人的に "lastN"フラグアプローチを使用します。私は(私を引用しないで)関係は、自動的にコアデータを使った複数のラウンドトリップを意味すると思います。 –