2012-03-14 11 views
2

私はコアデータモデルに1対多数の関係を持っています。 1つの食事は複数の食べ物を持つことができる。私は1つの食事から食べ物をテーブルに入れたい。だから食事#1にリンゴ、オレンジ、レモンがあれば、テーブルはそれらの3つの食物で構成されます。コアデータの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

なぜここで一対多の関係を使用するのですか? 「食品」が特定の食品ではなく食品の* kind *を表す場合、私は与えられた「食品」インスタンスが複数の食事に関連することができると期待します。 – Caleb

+0

あなたの問題は解決しましたか? –

答えて

3

あなたは問題があると言いますが、問題は何も言いません。あなたのNSFetchRequest述語は私には見えません。またFoodに定義されたmealsも複数ですが、関係はTo-one - 少し混乱します。

あなたのUITableViewには、MealFoodが入力されているはずですか?その後、フェッチ述語があるべき、のはそのMeal_thisMealを呼ぶことにしましょう:

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

だから、あなたがフェッチしているエンティティがFoodです。この述語は、mealsプロパティがUITableViewControllerが探している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

+1

申し訳ありませんが、あなたの 'UITableViewController'はあなたの' NSFetchRequest'を動作させるためにMealが表示されていることを '知る'必要があります。おそらく、前のテーブルビューで選択された後、おそらく上流のどこかからMeal参照を取得します。議論のために、私はちょうど '_thisMeal'と呼んでいました。あなたのコードで、特定の食事への参照が何であるかわからないからです。 – FluffulousChimp

+0

食事を食べる方法を教えてもらえますか? 「カスタムミール」と名付けられた食事ミールが必要な場合は、カスタムフーズにある食品を表示することにします。この全体のコンセプトは私を混乱させています。 – Vikings

0

Mealという名前の「カスタム食事を」フェッチするにはMeal

という名前を取得する方法を示すように更新します。あなたのfetchedResultsController getterメソッドで

enter image description here

、行を殺す:それは(あなたのエンティティが選択されていることを確認)を介してこれらを殺し、XCodeの自動 これらのクラスを再生成させるのがベストです

[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クラスです。 – Vikings

関連する問題