имам Item
субект и а Wishlist
образувание. Елементът може да бъде в множество списъци с желания, а списък с желания може да съдържа няколко елемента.
С WishlistTableViewController
, в който са изброени всички списъци с желания, искам да избера един от тях и да покажа всички елементи в него. Изпращам Wishlist
елемент към моя ItemTableViewController
, но аз съм затворен в създаването на предикат.
По принцип искам да получа всички елементи от даден списък с желания.
В SQL, това ще бъде нещо като:
SELECT *
FROM Item
WHERE WishlistItem.wishlist_id = wishlist.wishlist_id
(може да липсват вътрешни съединения, това е много груба скица, аз не съм кодирал SQL в години)
Разбира се, данните от ядрото автоматично създават тази средна таблица, когато имаме връзки с много към много, така че как да създам подобен предикат с помощта на NSPredicate
? Имам моите прихванати резултати контролер получават всички елементи в момента, без предикат (тя nil
). Това е поведението по подразбиране, ако потребител не идва от определен списък с желания.
Отговори:
1 за отговор № 1Ако "списъци с желания" е връзката "до-много" от Вещ да се списък с желания, можеш да използваш следния предикат за получаване на всички елементи, свързани с избрания списък:
WhishList *selectedWishList = ...;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY wishlists == %@", selectedWishList];
1 за отговор № 2
С Core Data обикновено ще установите връзка много към много. Item
ще се нарича много отношения wishlists
, Wishlist
ще се нарича много отношения items
и тези взаимоотношения ще бъдат обратни.
С тези отношения предикатът не е необходим. Ако искате да получите всички елементи за списък с желания, просто ще го направите
Wishlist *wishlist = ... // passed in from WishlistTableViewController
NSSet *items = [wishlist valueForKey:@"items"];
Или ако имате обичай NSManagedObject
подкласове, можете да направите това:
NSSet *items = [wishlist items];