2011-12-07 13 views
1

コアデータが残っています。私は1:Mの関係を構築しました。会社と従業員を挙げましょう。コアデータ1:Mの関係のレコードを表示

私はその後、私は従業員を作成し、会社を作成します。

Employees *employee = (Employees *)[NSEntityDescription insertNewObjectForEntityForName:@"Employees" inManagedObjectContext:myObjectContext]; 

employee.name = employeeName; 
employee.company = company; 

NSError *error = nil;  
if (![myObjectContext save:&error]) 
{ 
    // Handle the error. 
    NSLog(@"error: %@", error.description); 
} 

私は、SQLファイルを分析した場合、私は従業員レコードの親列が正しく会社識別子が移入されていることがわかります。 今私は自分のテーブルビューで会社を選択し、その従業員を別のテーブルビューで表示したいと思います。次のように私はNSFetchedResultsControllerを実装:

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

//retrieve context 
if (myObjectContext == nil) 
{ 
    id appDelegate = (id)[[UIApplication sharedApplication] delegate]; 
    self.myObjectContext = [appDelegate managedObjectContext]; 
} 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription         entityForName:@"Employees" inManagedObjectContext:myObjectContext]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setFetchBatchSize:20]; 

NSFetchedResultsController *myFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:myObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
self.fetchedResultsController = myFetchedResultsController; 
fetchedResultsController.delegate = self; 

return fetchedResultsController; 
} 

を、私はviewDidAppearでそれを呼び出す:

- (void)viewDidAppear:(BOOL)animated 
{ 
[super viewDidAppear:animated]; 

NSError *error = nil; 
//call the fetch 
if (![[self fetchedResultsController] performFetch:&error]) 
{ 
    NSLog(@"Error with fetchedResultsController: %@, %@", error, [error userInfo]); 
    exit(-1); 
} 
[self.tableView reloadData]; 

} 

問題は、すべての従業員は、とだけでなく、選択した会社のものは、表示されていることです。

アイデア?

答えて

0

あなたのフェッチ要求は、条件なしですべての従業員をフェッチするように設定されているので、データベース内のすべての従業員を取得します。フェッチ要求の述語をNSPredicateを使用して設定し、前のビューで選択した会社がCompanyである従業員のみを選択する必要があります。または、私が取るアプローチは、Companyオブジェクトを選択し、そのmanagedObjectIdまたはmanagedObject自体をEmployeeテーブルビューコントローラに渡し、そこから従業員をフェッチするために設定した関係を使用して、コアデータがフォールトを埋め込み、フェッチします。関連する従業員オブジェクトをデータベースから削除します。

適切に関係を設定すると、selectedCompany.employeesを呼び出すと、UITableViewControllerのデータソースとして使用できるNSSetが返されます。

編集

あなたは適切NSFetchedResultsControllerがもたらすメモリ効率の利益を得るために、フェッチ結果コントローラのアプローチとセットアップ述語に固執することをお勧めします関係で、従業員の多くが潜在的に存在する場合テーブルに。

+0

私はObjectContextとCompanyオブジェクトをEmployees View Controllerに渡しましたが、どの会社が以前にFetchedResultsControllerに選択され、関連する従業員だけを表示するかを知ることはできません。何か提案してください? 私はこのように見つけました: NSArray * a = [company.employees allObjects]; //従業員は関係です ' これは正しい方法ですか?これは、従業員のビューコントローラでコアデータNSFetchedResultsControllerを使用できないが、すべての従業員にのみ配列を使用できることを意味しますか? – yassassin

+0

はい、この方法で使うことができます。これが最も単純な方法です。これは、私が関係を使って意味したものです。別のNSFetchedResultsコントローラが必要な場合は、選択した会社の従業員だけを取得するNSPredicateで設定する必要があります。 –

+0

私は理解しました、ありがとう... しかし、この時点で、約1:1の関係は何ですか?たとえば、EmployeesとEmployeeDetailsの場合、1つのEmployeeにはEmployeeDetailとviceversaが1つしかありません。 選択した従業員のEmployeeDetailsビューコントローラでEmployeeDetailに関する情報を取得するにはどうすればよいですか? – yassassin

関連する問題