Подтвердить что ты не робот

Проблема с отрицанием отношений основных данных NSPredicate

Я почесываю голову над этим. У меня есть работа, но я не понимаю, так что это не значит. То, что я хочу сделать, - это сущность (в этом случае, скажем, "Фото" ), я хочу найти все фотографии, просмотренные кем-либо, кроме указанного пользователя. Взаимоотношения здесь - Photo- > Review- > User, где фотография может иметь несколько обзоров, и каждый обзор принадлежит только одному пользователю. Первые два примера были моими логическими попытками, но не работают. Я нашел некоторый похожий код, который показывает подзапрос, который работает, но может ли кто-нибудь объяснить, почему первые два примера не работают?

// 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 == %@)[email protected] == 0", self.user];
4b9b3361

Ответ 1

попробуйте это

NSPredicate *predicate = [NSCompoundPredicate notPredicateWithSubpredicate:[NSPredicate predicateWithFormat:@"ANY reviews.user = %@", self.user]];

Ответ 2

[NSPredicate predicateWithFormat:@"NOT reviews.user = %@", self.user]

Ответ 3

Проблема заключается в том, что вы хотите сравнивать отношения в своем предикате, а не в атрибутах. Ваш 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;

Ответ 4

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

NSPredicate *predicate = [NSPredicate [email protected]"ANY reviews.user.objectId != %@", self.user.objectId];