NSPredicate: присоединение к объекту или идентификатору объекта - PullRequest
1 голос
/ 14 февраля 2012

У меня есть модель данных coredata с отношением 1: n

Entity Item
Tag *tag;
....

Entity Tag
NSString *name;

Я хочу получить Предметы, имеющие отношение к Тегу. Следующие работы:

Tag *selectedTag = .....
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag.name =  %@", selectedTag.name];

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

Как напрямую сравнить объект (selectedTag) или хотя бы сравнить с идентификатором.

Оба:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[tag objectID] == %@", [selectedTag objectID] ]; 

не работают.

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Звучит так, как будто вы хотите установить обратную связь тега.

Если Foo имеет отношение «один к одному» с Tag, называемое tagMember, обратное отношение которого является отношением Tag-to-many к Foo, называемым fooMembers, то получить набор всех foos, для которых tagMember является выделенный тег, вы бы сделали это:

NSSet *setOfFoos = selectedTag.fooMembers;

Или, если вы не настроили подкласс для Tag и, следовательно, не можете использовать точечный синтаксис, вы должны сделать это:

NSSet *setOfFoos = [selectedTag valueForKey:@"fooMembers"];

(Другими словами, поскольку у вас уже есть элемент, связанный с объектами, которые вы ищете, вы можете получить эти объекты непосредственно из этого элемента, а не запускать выборку.)

0 голосов
/ 24 января 2013

Для данного объекта, имеющего отношение к родителю, вы можете использовать предикат, который опирается на сам дочерний объект.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag];

Примените этот предикат к NSFetchRequest для родительского объекта.Для отношения 1: n вы должны получить результирующий набор, содержащий 0 или 1 родительский объект.

...