Базовые данные: объект в предикате - PullRequest
1 голос
/ 29 июня 2011

В моей основной объектной модели данных у меня есть 3 объекта с соответствующими отношениями, так что у MyObject может быть много MyObjectProperties, а у каждого свойства может быть один MyObjectPropertyImage.

Учитывая myObject, я хочу получить все изображения.

Я пытаюсь сделать это, используя следующий предикат, однако я получаю пустой массив:

[NSEntityDescription entityForName:@"MyObjectPropertyImage" inManagedObjectContext:managedObjectContext];
[NSPredicate predicateWithFormat:@"ANY myObjectProperty.myObject == %@", myObject];

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

При работе с базовыми данными лучше всего думать о ваших сущностях как об объектах в графе объектов, а не в таблицах базы данных. Следовательно, вам не нужно извлекать объекты, связанные с другими, используя предикат. Вместо этого перемещайтесь по графу объектов, используя отношения, определенные в модели. Чтобы получить все изображения, связанные с myObject:

// assuming the relationships are called 'myObjectProperties' and 'myObjectPropertyImage', respectively
NSSet *allImages = [myObject.myObjectProperties valueForKey:@"myObjectPropertyImage"];

Обратите внимание, что это может вызвать дополнительные поездки в базу данных, если ваш граф объектов не загружен в память для вашей сущности myObject. Чтобы избежать этого, убедитесь, что в запросе на выборку вы установили ключевые пути предварительной выборки для myObject.

Надеюсь, это поможет ...

0 голосов
/ 30 июня 2011

Поскольку у вас есть экземпляр MyObject в руке, и он имеет путь отношения myObjectProperties-->ObjectProperty-->>PropertyImages, вам просто нужно пройти через отношения.Это легко сделать с помощью valueForKeyPath:

Таким образом:

NSArray *images=[myObjectInstances valueForKeyPath:@"myObjectProperties.propertyImage"];

(Примечание. Возможно, вы неправильно указали имена ваших атрибутов, но вы можете понять, что именно).Как правило, вы никогда не выбираете, когда есть объект из графика.Вы выбираете «выбрать поток» объектов, соответствующих предикату, а затем найти все связанные объекты, которые вы придерживаетесь потока / отношений со связанными объектами.

...