2012-03-14 147 views
2

我在我的核心数据模型中拥有一对多关系。一餐可以有多种食物。我想用一顿饭中的食物填充一张桌子。所以如果第一餐含有苹果,橙子和柠檬,那么这张桌子就包含了这三种食物。核心数据一对多关系

任何帮助非常感谢,因为我完全卡住了。

这里是我的模型:

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 2012-03-14 02:58:38

+0

为什么在这里使用一对多的关系?如果“食物”代表一种食物而不是特定的食物,那么我希望给定的“食物”实例能够与多餐相关。 – Caleb 2012-03-14 06:21:56

+0

你的问题解决了? – 2012-03-14 06:40:05

回答

3

你提到你有问题,但不是问题是什么;但是你的谓词NSFetchRequest对我来说并不合适。另外meals定义Food是复数,但关系是一对一 - 有点混淆。

您的UITableView应该从单个Meal填充Food,对吧?让我们称之为Meal_thisMeal,则取谓语应该是:

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

所以,您要提取的实体是Food;并且这个谓词确保它们的meals属性是您的UITableViewController正在查找的Meal

更新,以显示如何获取一个名为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。这条线应该是什么? – Vikings 2012-03-14 11:11:08

+1

对不起,我的观点是你的'UITableViewController'必须'知道'正在显示什么餐才能让你的'NSFetchRequest'工作。据推测,它可能从上游某个地方得到一份膳食参考,也许在之前的表格视图中被选中。为了讨论起见,我只是把它称为'_thisMeal',因为我不知道在你的代码中对特定餐的引用是什么。 – FluffulousChimp 2012-03-14 11:19:50

+0

你能告诉我如何得到膳食_thisMeal?比方说,我想要一顿名为“自定义膳食”的膳食,然后我要显示自定义食物中的食物。这整个概念让我感到困惑。 – Vikings 2012-03-14 11:29:09

0

你的膳食和食品类是错误的。这是最好的杀死那些让XCode的自动重新生成 通过这些类(请确保您的实体被选中):

enter image description here

在你fetchedResultsController getter方法,杀线:

[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

这些是Xcode生成的NSManageObject类 – Vikings 2012-03-14 12:08:14