Основные данные NSFetchRequest для конкретных отношений? - PullRequest
4 голосов
/ 17 марта 2011

Я перевожу существующую модель данных, которая ранее хранилась в XML, в Core Data, поэтому я стараюсь как можно точнее изучать веревки. Базовые данные - это, очевидно, одна из тех технологий, которая никуда не денется в ближайшее время, поэтому я мог бы также «изучить ее правильно».

Возьмем, к примеру, модель базовых данных с двумя сущностями:

  1. лицо
  2. Питание

Человек имеет 2 отношения один-ко-многим с Еда :

  1. любимые продукты (1 ко многим)
  2. ненавистные продукты (1 ко многим)

(Person и Food также являются подклассами NSManagedObject.)

В предыдущей модели данных Person поддерживал две NSArray переменные экземпляра. Если бы я хотел любимые блюда, я мог бы позвонить:

Person *fred = [[Person alloc] init];    
NSArray *fredsFavorites = fred.favoriteFoods;

Легкое сжатие.

Я читаю документацию для Core Data, и я не могу найти правильный способ получить этот NSArray с учетом NSFetchRequest, потому что Я не могу определить, какую связь я хочу получить объекты из.

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Food" inManagedObjectContext:[fred managedObjectContext]]];
[request setIncludesSubentities:NO];
NSArray *fredsFavoriteAndHatedFoods = [[fred managedObjectContext] executeFetchRequest:request error:nil];

Возвращает все элементы Food , хранящиеся в favoriteFoods и hatedFoods. Как я могу разделить это? Конечно, есть простое объяснение, но в настоящее время я недостаточно хорошо понимаю концепцию, чтобы объяснить ее на языке жаргонных данных, поэтому мой поиск в Google бесплоден.

1 Ответ

8 голосов
/ 17 марта 2011

Самый простой способ получить его - просто получить доступ к соотношению NSSet напрямую:

NSArray *fredsFavorites = [fred.favoriteFoods allObjects];

(я показал, как получить NSArray из полученного NSSet).

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

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Food" inManagedObjectContext:[fred managedObjectContext]]];
[request setPredicate:[NSPredicate predicateWithFormat:@"ANY personsWithThisAsFavorite == %@", fred]];
NSArray *fredsFavoriteFoods = [[fred managedObjectContext] executeFetchRequest:request error:nil];

Это предполагает, что personsWithThisAsFavorite - это обратное отношение к favoriteFoods.Если я не читаю ваш пример неправильно, favoriteFoods действительно должно быть отношением «многие ко многим», поскольку у человека может быть несколько любимых блюд, а в еде может быть несколько человек с этой едой в качестве любимой.

(обратите внимание, что я не проверял это, поэтому NSPredicate может быть не на 100% правильным)

...