显示核心数据1:M关系的记录

时间:2011-12-07 22:06:36

标签: ios core-data relationship

我很遗憾地坚持使用核心数据。我建立了一个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文件,我可以看到Employees记录的Parent列正确填充了Company标识符。 现在我想在我的tableview中选择一个公司,并在另一个tableview中显示其Employees。我按如下方式实施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];

}

问题在于显示所有员工,而不仅仅是所选公司中的员工。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的获取请求被设置为无条件地获取所有员工,因此就像您看到的那样,您将获得数据库中的所有员工。您需要使用NSPredicate在获取请求上设置谓词,并且只选择其公司是您在上一个视图中选择的公司的员工。或者,我将采用的方法是,选择Company对象,将其managedObjectId或managedObject本身传递给Employee tableview控制器,并使用您设置的关系从中获取员工,Core Data将填写任何错误并获取来自数据库的相关员工对象。

如果正确设置关系,调用selectedCompany.employees将返回一个NSSet,您可以将其用作UITableViewController的数据源。

修改

如果关系中可能存在大量员工,您可能希望坚持使用获取的结果控制器方法并相应地设置谓词,以获得NSFetchedResultsController带来的内存效率优势。