4

は、私は2つのエンティティ(項目プロパティ)で、単純なコアデータモデルを使用しています名前

項目コアデータ:特定のオブジェクトの多対多関係のすべてのエンティティを取得しますか?プロパティ</strong><br> </p> <p><strong>項目</strong><br> 名<br> <em>性質</em></p> <p><strong>:私のiPhoneアプリケーションで

項目は一つの属性(名前)と1つの1対多関係(特性)を有しています。その逆の関係は、の項目です。 プロパティには、逆の関係に従う2つの属性があります。

今私は2つのレベルでテーブルビューで自分のデータを表示したいと思います。最初のものはすべてのアイテムをリストします。 1つの行が選択されると、新しいUITableViewControllerが私のUINavigationControllerのスタックにプッシュされます。新しいUITableViewは、選択された項目のすべてのプロパティ(つまり、その名前)を表示することになっています。

これを実現するために、インスタンス変数に格納されているNSFetchedResultsControllerを使用します。最初のレベルでは、このようNSFetchedResultsControllerを設定するとき、すべてが正常に動作します:

-(NSFetchedResultsController *) fetchedResultsController { 
    if (fetchedResultsController) return fetchedResultsController; 

    // goal: tell the FRC to fetch all item objects. 
    NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.moContext]; 
    [fetch setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    [fetch setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    [fetch setFetchBatchSize:10]; 

    NSFetchedResultsController *frController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch managedObjectContext:self.moContext sectionNameKeyPath:nil cacheName:@"cache"]; 
    self.fetchedResultsController = frController; 
    fetchedResultsController.delegate = self; 

    [sort release]; 
    [frController release]; 
    [fetch release]; 

    return fetchedResultsController; 
} 

しかし、セカンドレベルのUITableViewに、私は間違って何かをするように見えます。私は同様の方法でfetchedresultsControllerを実装しました:

今は変です。上記のNSLogステートメントは、選択した項目の正しい数のプロパティを返します。ただし、UITableViewDelegateメソッドは、プロパティがないことを通知します。

-(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; 
    NSLog(@"Found %d properties for item \"%@\". Should have found %d.",[sectionInfo numberOfObjects], self.item.name, [self.item.properties count]); 
    // logs "Found 0 properties for item "item". Should have found 3." 
    return [sectionInfo numberOfObjects]; 
} 

同じ実装が最初のレベルで正常に動作します。

さらに奇妙になっています。私はプロパティを追加するために何らかのUIを実装しました。私は新しいプロパティインスタンスをProperty *p = [NSEntityDescription insertNewObjectForEntityForName:@"Property" inManagedObjectContext:self.moContext];経由で作成し、関係を設定して[self.moContext save:&error]を呼び出します。これは、errorがまだnilであり、オブジェクトが保存されるため動作しているようです(の項目インスタンスをログに記録すると、プロパティの数がわかります、上記参照)。ただし、デリゲートメソッドは起動されません。これはおそらく、fetchRequest(Controller)が乱れているように思われます。

アイデア? 2回目のフェッチリクエストを駄目にしましたか?これは、特定のインスタンスの多対多関係のすべてのエンティティをまったく取得する正しい方法ですか?

答えて

2

あなたは実際にはテーブルビューコントローラのフェッチを実行する必要がありますあまりにも...シンプル

// ...create the fetch results controller...  
NSError *fetchRequestError; 
BOOL success = [fetchedResultsController performFetch:&fetchRequestError]; 
+0

道を...。ありがとう、私はコーヒーを手に入れるべきです。:) –

+0

まあ、それは他のコードの全体の多くの真ん中に立ち往生した小さなビットのコードです。コアデータは複雑な獣です。 –

+0

申し訳ありませんが、私はちょっと混乱しています。上記のコードスニペットはどの行に置き換えられますか? – jklp

関連する問題