Базовые данные: предикат для множества отношений - PullRequest
6 голосов
/ 09 февраля 2010

У меня есть модель CoreData с 4 объектами.

Скриншот модели -> http://img96.imageshack.us/img96/7857/screenshot20100209at182.png

Государство

-StateName

Расположение:

-locationName (атрибут)

-locationDescription

-locationActivities (родство)

-состояние (отношения)

LocationActivities:

-расположение (родство)

-активность (отношения)

Мероприятия

-activityName (атрибут)

-расположенияДеятельность (отношения)

Как я могу написать запрос, который выбирает все местоположения, которые имеют

(деятельность = 'Гольф' ИЛИ ​​деятельность = «Плавание») И состояние = «ЛА»

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010
// With some NSManagedObjectContext *moc
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Location"
                               inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:
                       @"(locationActivities.activity.activityName == %@ OR 
                          locationActivities.activity.activityName == %@) AND 
                         state.stateName == %@",
                       @"Golf", @"Swimming", @"LA"]];
NSError *error;
NSArray *results = [moc executeFetchRequest:request error:&error];

Как правило, выполняйте выборку базовых данных как обычно, а затем создайте соответствующий предикат для фильтрации результатов (как описано в Руководство по программированию предикатов ).

1 голос
/ 10 февраля 2010

Я только что заметил, что на вашем снимке экрана ваша LocationActivities сущность фактически написана LocationAtivities (обратите внимание на пропущенную букву "c").

Этого достаточно, чтобы разрушить ваш график. Любой предикат, который ищет LocationActivities, потерпит неудачу.

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

0 голосов
/ 10 февраля 2010

Кроме того, вам нужно перестать думать с точки зрения таблиц и запросов для базовых данных. В Базовых данных эти особенности только постоянного хранилища sqllite, и вы никогда не видите их и не имеете с ними дело.

Объекты не являются таблицами, а отношения не связывают таблицы. Попытка втиснуть объектную модель в SQL в вашей голове приведет вас к печали, потому что Core Data не работает как SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...