2012-01-30 16 views
7

A. b i B. a są relacjami odwrotnymi do wielu. Dlaczego ten predykat dla A pracy:Dlaczego "NOT IN" nie działa w tym NSPredicate?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT SELF IN %@", bObject.a]; 

podczas gdy ten nie:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT %@ IN b", bObject]; 

myślę oba predykaty powinien dać ten sam wynik - zbiór A s, które nie mają związku z bObject poprzez a<-->b. Ale w rzeczywistości pierwsza daje prawidłową kolekcję, a druga nie.

Update:


Oto sample project którym A. b jest zawarte w Account. filtered_clients i B. a jest wcielony przez Client. filtered_by.

Przełącz komentarz do linii 143 i linii 144 w MasterViewController.m, aby zobaczyć różnicę.

Proszę mi pomóc znaleźć błąd w moim kodzie lub potwierdzić, że jest to błąd Core Data, więc mogę zgłosić to firmie Apple. Dziękuję bardzo.

+0

Twój drugi predykat wydaje się testować, jeśli b nie jest w b - czy to masz na myśli? –

+0

Jak zauważył Nick: możesz podać nieco więcej kodu. Jaka jest zmienna "b"? W jaki sposób generowane jest żądanie pobierania? –

+0

Aby być bardziej zrozumiałym, zmieniłem nazwę zmiennej na "bObject", która jest instancją klasy B. – an0

Odpowiedz

0

Z dokumentacji:

Ważne Należy zdefiniować wiele do wielu relacji w obu kierunkach , to znaczy, należy określić dwa związki, każdy będąc odwrotność drugiego. Nie można po prostu zdefiniować relacji "to-many" w jednym kierunku i próbować używać go jako wiele-do-wielu. Jeśli to zrobisz, zakończy się problemami integralności referencyjnej.

Więc to sprawdzić:

  1. A ma do wielu relacji do B.
  2. B ma do wielu relacji A.
  3. A związek jest odwrotnością relacji B .
  4. Relacja B jest odwrotnością relacji A.
+0

Przeczytaj poniższe pytanie i komentarze. Jest to oczywiście relacja wielostronna. – an0

+0

Ufam, że sprawdziłeś dwa razy ... – Mundi

+0

Tak, sprawdziłem dwa razy. – an0

3

Oto kolejny pomysł: może to jest próba "zanegowania" bObject z NOT. Tak więc spróbuj:

@"NOT (%@ IN b)" 
+1

To samo, co @ "NOT% @ IN b". – an0

0

Myślę, że znalazłem odpowiedź dla osób, które natrafiają na to pytanie. Najwyraźniej musisz użyć SELF, aby działał, przynajmniej w moim przypadku z dwoma relacjami wiele do wielu. To działa dla mnie:

NOT (SELF IN %@)