2012-03-14 3 views
2

У меня есть отношение «один ко многим» в моей модели данных ядра. Одна еда может иметь несколько продуктов. Я хочу заполнить таблицу продуктами из одной еды. Поэтому, если в блюде № 1 есть яблоки, апельсины и лимоны, тогда таблица будет состоять из этих трех продуктов.Основные данные Отношение «один ко многим»

Любая помощь очень ценится, потому что я полностью застрял.

Вот моя модель:

enter image description here

И Классы NSManagedObject:

Meal.h

@class Food; 

@interface Meal : NSManagedObject 

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSSet *foods; 

@end 

@interface Meal (CoreDataGeneratedAccessors) 

- (void)addFoodsObject:(Food *)value; 
- (void)removeFoodsObject:(Food *)value; 
- (void)addFoods:(NSSet *)values; 
- (void)removeFoods:(NSSet *)values; 

@end 

Food.h

@class Meal; 

@interface Food : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) Meal *meals; 

@end 

Вот код, где я пытаюсь это сделать, но у меня возникают некоторые проблемы.

- (NSFetchedResultsController *)fetchedResultsController 
{  
    if (_fetchedResultsController != nil) 
     return _fetchedResultsController; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Food" inManagedObjectContext:_context]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"Meal.foods == %@", entity]]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_context sectionNameKeyPath:nil cacheName:@"Root"]; 

    self.fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 

    [fetchRequest release]; 
    [theFetchedResultsController release]; 

    return _fetchedResultsController;  
} 
+0

Что вы застряли на.? Расскажите, пожалуйста, какие у вас проблемы. – sosborn

+0

Зачем использовать отношения «один ко многим» здесь? Если «Продовольствие» представляет собой * вид * пищи, а не определенный кусок пищи, я бы ожидал, что данный экземпляр «Food» сможет быть связан с несколькими приемами пищи. – Caleb

+0

Ваша проблема решена ?? –

ответ

3

Вы упомянули, что у вас возникли проблемы, но не в том, что касается проблем; но ваш предикат NSFetchRequest выглядит не так. Также meals, определенный на Food, является множественным, но отношения являются одними - немного запутанными.

Ваш UITableView должен быть заполнен Food с одного Meal, справа? Давайте назовем, что Meal_thisMeal, то выборка предикат должен быть:

NSPredicate *foodPredicate = [NSPredicate predicateWithFormat:@"meals == %@",_thisMeal]; 
[fetchRequest setPredicate:foodPredicate]; 

Таким образом, объект вы выборки является Food; и этот предикат гарантирует, что их свойство meals - это Meal, который ищет ваш UITableViewController.

Обновлено, чтобы показать, как принести поименованный Meal

Чтобы принести Meal под названием «заказ еды»:

Meal *_thisMeal = nil; 
// this assumes that there should be only one Meal named "Custom Meal" 
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Meal"]; 
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"name = %@",@"Custom Meal"]; 

NSError *fetchError = nil; 
NSArray *meals = [_context executeFetchRequest:request error:&fetchError]; 
if(fetchError) 
    NSLog(@"%s - ERROR while fetching Meal: %@,%@",__FUNCTION__,fetchError,[fetchError userInfo]); 
else if([meals count] != 0) 
    _thisMeal = [meals objectAtIndex:0]; 
+0

Можете ли вы объяснить обед _thisMeal? Эта строка даст мне ошибки Meal * _thisMeal. Какая должна быть эта линия? – Vikings

+1

Извините, мой вопрос заключался в том, что ваш 'UITableViewController' должен« знать », какая музыка отображается, чтобы ваш' NSFetchRequest' работал. Предположительно, он получает ссылку на питание от где-то вверх по течению, возможно, после выбора в предыдущем представлении таблицы. Ради обсуждения я просто назвал это '_thisMeal', потому что я не знаю, в вашем коде, что такое ссылка на конкретную пищу. – FluffulousChimp

+0

Можете ли вы показать мне, как получить питание _thisMeal? Предположим, я хочу, чтобы еда Meal называлась «Custom Meal», затем я решил показать продукты, которые находятся в Custom Foods. Вся эта концепция меня сбивает с толку. – Vikings

0

Ваша еда и питание классы являются неправильными. Лучше всего, чтобы убить тех, и пусть XCode автоматически повторно генерировать эти классы через (убедитесь, что ваш объект выбран):

enter image description here

В вашем методе fetchedResultsController газопоглотительного, убить строку:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"Meal.foods == %@", entity]]; 

Обычно вы использовали предикат для фильтрации ваших данных, таких как продукты, содержащие бананы. На данный момент ваш текущий предикат действительно не имеет смысла. Это говорит: «Дайте мне питание, которое содержит пищу под названием« сущность », ... не имеет смысла.

Поскольку вы хотите получить питание ...

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Food" inManagedObjectContext:_context]; 

должно быть:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Meal" inManagedObjectContext:_context]; 

(обратите внимание на @"Meal").

После этого вы получите доступ к пище от каждого приема пищи через meal.foods.

Эта линия:
self.fetchedResultsController = theFetchedResultsController;
должно быть:
_fetchedResultsController = theFetchedResultsController;
Что ты в основном называют метод, который вы в настоящее время в

+0

Это классы NSManageObject, генерируемые Xcode – Vikings

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