我很遗憾地坚持使用核心数据。我建立了一个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];
}
问题在于显示所有员工,而不仅仅是所选公司中的员工。
有什么想法吗?
答案 0 :(得分:0)
您的获取请求被设置为无条件地获取所有员工,因此就像您看到的那样,您将获得数据库中的所有员工。您需要使用NSPredicate
在获取请求上设置谓词,并且只选择其公司是您在上一个视图中选择的公司的员工。或者,我将采用的方法是,选择Company对象,将其managedObjectId或managedObject本身传递给Employee tableview控制器,并使用您设置的关系从中获取员工,Core Data将填写任何错误并获取来自数据库的相关员工对象。
如果正确设置关系,调用selectedCompany.employees
将返回一个NSSet,您可以将其用作UITableViewController
的数据源。
修改强>
如果关系中可能存在大量员工,您可能希望坚持使用获取的结果控制器方法并相应地设置谓词,以获得NSFetchedResultsController
带来的内存效率优势。