NSPredicate для отношения ко-многим, где отношение (NSSet) должно содержать сущности, определенные в NSArray - PullRequest
1 голос
/ 28 сентября 2010

Учитывая следующую базовую модель данных:

-> : to-one releationship  
->>: to-many relationship

Entity A ->> Entity B 
Entity B -> A // each B belongs to exactly one A  
Entity B ->> B // a B can be related to other B's

Так в классе A:

@property (nonatomic, retain) NSSet *Bs;

В классе B:

@property (nonatomic, retain) A *A;  
@property (nonatomic, retain) NSSet *Bs; 

Предположим, у меня есть NSArray *myArray, содержащий (Bj, Bk).

Мне нужно получить все B, принадлежащие Ax и связанные с Bj и Bk:

Кодниже работает, но совершенно некрасиво, так как я должен жестко закодировать NSP-предикат на основе числа (здесь это 2, но это может быть 10 или около того) из B в массиве:

NSEntityDescription *fetchedEntity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:self.managedObjectContext];
[NSPredicate predicateWithFormat:@"A == %@ and (Bs contains %@) and (Bs contains %@)", Ax, [myArray objectAtIndex:0], [myArray objectAtIndex:1]];

Как мне переписать предикат, чтобы он был более универсальным? Это должно быть так очевидно, но я просто не вижу его ...

1 Ответ

2 голосов
/ 28 сентября 2010

[NSPredicate predicateWithFormat:@"A==%@ AND (ALL %@ IN Bs)", Ax, myArray];

делает то, что вы ожидаете?Я не уверен (и далеко от моей коробки OS X), является ли этот предикат переводимым на SQL для ядра Core Data SQLite.Вам может понадобиться выражение SUBQUERY :

[NSPredicate preidcateWithFormat:@"A==%@ and SUBQUERY(Bs, $x, $x IN %@).@count == %d", Ax, myArray, myArray.count];

Это предполагает, что элементы в myArray уникальны.

...