Взаимосвязь основных данных «один ко многим» - PullRequest
2 голосов
/ 14 марта 2012

У меня есть отношение один ко многим в моей модели базовых данных.Одна еда может иметь несколько продуктов.Я хочу заполнить стол с продуктами от одного приема пищи.Так что если в еде № 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;      
}

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

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

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

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

Итак, сущность, которую вы выбираете - Food; и этот предикат гарантирует, что их свойство meals соответствует Meal, которое ищет ваш UITableViewController.

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

Чтобы получить Meal с именем "Custom 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 голосов
/ 14 марта 2012

Ваши классы еды и еды неправильны. Лучше убить их и позволить 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;
То, что вы сделали, это в основном вызов метода, в котором вы находитесь.

...