0

У меня есть объект Item и объект Wishlist. Элемент может быть в нескольких списках пожеланий, а список пожеланий может содержать несколько элементов.NSPredicate для двусторонних отношений с использованием Core Data?

С WishlistTableViewController, в котором перечислены все списки пожеланий, я хочу выбрать один и показать все элементы внутри выбранного. Я отправляю элемент Wishlist на свой ItemTableViewController, но я застреваю при создании предиката.

В принципе, я хочу получить все предметы из данного списка желаний.

В SQL, это было бы что-то вроде:

SELECT * FROM Item WHERE WishlistItem.wishlist_id = wishlist.wishlist_id

(может отсутствовать внутренние соединения, это очень грубый набросок, я не закодированы SQL в годах)

Из Конечно, Core Data автоматически создает эту среднюю таблицу, когда у нас есть отношения «многие ко многим», так как я могу создать аналогичный предикат, используя NSPredicate? У меня есть мой контролер результатов, получающий все предметы на данный момент, без предиката (это nil). Это поведение по умолчанию, если пользователь не приходит из определенного списка пожеланий.

ответ

1

Если «Сундуки» это отношение ко многим из Пункт в лист пожеланий, вы можете использовать следующий предикат, чтобы получить все элементы, связанные с выбранным со списком:

WhishList *selectedWishList = ...; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY wishlists == %@", selectedWishList]; 
1

С Core Data вы обычно настраиваете отношения «многие-ко-многим». Item будет иметь отношение ко многим: wishlists, Wishlist будет иметь отношение ко многим, которое называется items, и эти отношения будут обратными друг другу.

С этими отношениями предикат не нужен. Если вы хотите, чтобы получить все пункты для желаний, вы бы просто сделать

Wishlist *wishlist = ... // passed in from WishlistTableViewController 

NSSet *items = [wishlist valueForKey:@"items"]; 

Или если у вас есть собственные NSManagedObject подклассы, вы можете сделать это:

NSSet *items = [wishlist items]; 
+0

Вот что моя установка! Я забыл объяснить это так же хорошо, как и вы, но в моем проекте Core Data, вот как он настроен. Я делаю «NSFetchRequest» для загрузки tableview вверх, поэтому я использовал предикат. Можно ли загрузить таблицу с помощью 'NSSet' в методе' cellForRowAtIndexPath: '? О, и да, мои 'NSManagedObjects' подклассы. – swiftcode

+0

Вам придется сортировать набор в массив, чтобы вы знали, какой элемент использовать для какой ячейки. Вы можете либо сделать отдельную выборку с дескриптором сортировки (который предоставит вам массив), либо получить набор, как я описал, и отсортировать его с помощью 'sortedArrayUsingDescriptors:'. –

Смежные вопросы