2012-10-26 10 views
10

Konfiguracja:Jak utworzyć predykat danych podstawowych, aby sprawdzić, czy relacja zawiera wszystkie podane obiekty?

Mam obiekt Core Data A, który ma relację do wielu do B. Wywołaj relację "items". Więc a.items zwraca wszystkie B-ów związanych z A.

Teraz mam ręcznie złożoną NSSet „Zbiór,” obiektów B.

Chcę wykonać następujące czynności:

return all A objects whose "items" relation exactly matches itemSet 

Jak skonstruować predykat do tego? Próbowałem tego:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"(ALL items in %@)", itemSet]; 

Ale to tylko daje mi Unsupported predicate (null).

to:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"(items in %@)", itemSet]; 

mówi mi unimplemented SQL generation for predicate. Interesujące, ale nie pomocne.

Więc jaki jest właściwy sposób filtrowania relacji z zestawem?

Odpowiedz

19

Poniższa orzecznik może pracować:

[NSPredicate predicateWithFormat:@"([email protected] == %d) AND (SUBQUERY(items, $x, $x IN %@)[email protected] == %d)", 
         itemSet.count, itemSet, itemSet.count]; 

Kontrole predykatywnych pierwsze, że liczba elementów jest równa wielkości określonej itemSet, a następnie sprawdza, czy liczba elementów, które są członkiem itemSet jest również równy rozmiarowi itemSet. Jeśli oba są prawdziwe, wówczas items musi być równe itemSet.

+1

Interesujące. To działa. Gdzie mogę dowiedzieć się więcej o SUBQUERY? Oficjalne dokumenty predykatów są dość rzadkie. – Jaanus

+1

@Jaanus: Obawiam się, że nie mam lepszego odniesienia. Nauczyłem się tego głównie, próbując zrozumieć odpowiedzi innych ludzi w SO. –

+0

Miałem problemy związane z niewystarczającym użyciem nawiasów. Dzięki za odpowiedź @MartinR –

0

Czy próbowałeś:

NSPredicate *predicate = [NSPredicate predicateWithFormate:@"items == %@", itemSet]; 

Alternatywnie wyciągnąć podzbiór z prostszej orzecznika i filtrować je poza żądanie pobierania. tj.

  1. Ustawić predykat dla liczby elementów w relacji na taki sam, jak liczba elementów w zestawie porównawczym.
  2. Pobierz wyniki
  3. Filtruj wyniki, aby wyświetlić tylko te, w których zestawy zawierają te same elementy.
+0

Tak. Daje to kolejny wyjątek: '*** Kończenie aplikacji z powodu nieprzechwyconego wyjątku 'NSInvalidArgumentException', powód:" tutaj klucz do wielu nie jest dozwolony "' – Jaanus

+0

Ręczne filtrowanie (pierwsze pobranie według liczby, a następnie filtrowanie) jest zdecydowanie opcją, ale tworzy niepotrzebny ruch CD. Zastanawiam się, czy w ogóle jest to możliwe z predykatem czy nie. – Jaanus

Powiązane problemy