Проблема с отрицанием основных данных NSP Предикатные отношения - PullRequest
17 голосов
/ 29 июля 2011

Я почесал голову на этом. У меня есть работа вокруг, но я не понимаю ее, так что это не считается. Я хочу, чтобы для объекта (в данном случае, скажем, «Фото») я хочу найти все фотографии, просмотренные кем-либо ДРУГОЕ, чем указанный пользователь. Отношение здесь - Фото-> Обзор-> Пользователь, где фотография может иметь несколько обзоров, и каждый отзыв принадлежит только одному пользователю. Первые два примера были моими логическими первыми попытками, но не сработали. Я нашел похожий код, который показывает подзапрос, который работает, но кто-нибудь может объяснить, почему первые два примера не работают?

// this does not work
[NSPredicate predicateWithFormat:@"NOT (ANY reviews.user = %@)", self.user]

// this does not work
[NSPredicate predicateWithFormat:@"NONE reviews.user = %@", self.user]

// this works
[NSPredicate predicateWithFormat:@"SUBQUERY(reviews, $x, $x.user == %@).@count == 0", self.user];

Ответы [ 4 ]

3 голосов
/ 24 апреля 2013

попробуйте

NSPredicate *predicate = [NSCompoundPredicate notPredicateWithSubpredicate:[NSPredicate predicateWithFormat:@"ANY reviews.user = %@", self.user]];
0 голосов
/ 08 июля 2012

Проблема в том, что вы хотите сравнивать отношения в вашем предикате, а не в атрибутах.Ваш User должен иметь уникальный атрибут, такой как name.Я предлагаю использовать его в своем предикате следующим образом:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
NSPredicate * p = [NSPredicate predicateWithFormat:@"ANY comments.user.name != %@", @"John Smith"];
// NSPredicate * p = [NSPredicate predicateWithFormat:@"NONE comments.user.name == %@", @"John Smith"];
request.predicate = p;
0 голосов
/ 07 января 2013

Я считаю, что лучше проводить сравнения отношений Core Data, сравнивая уникальные идентификаторы рассматриваемой сущности, а не саму сущность. Например, в моем приложении есть объект с именем User, который имеет атрибут objectId. (Примечание: это не следует путать с внутренним objectID объекта Core Data. objectId - это просто уникальный первичный ключ из моей внешней БД. Тогда ваш предикат будет выглядеть так:

NSPredicate *predicate = [NSPredicate predicateWithFormat@"ANY reviews.user.objectId != %@", self.user.objectId];
0 голосов
/ 13 ноября 2011
[NSPredicate predicateWithFormat:@"NOT reviews.user = %@", self.user]
...