Просмотр записей для основных данных 1: отношение М - PullRequest
1 голос
/ 08 декабря 2011

К сожалению, я застрял с основными данными. Я построил отношения 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];

}

Проблема в том, что отображаются все сотрудники, а не только сотрудники выбранной компании.

Есть идеи?

1 Ответ

0 голосов
/ 08 декабря 2011

Ваш запрос на выборку настроен на выборку всех сотрудников без каких-либо условий, поэтому, как вы видите, вы получите всех сотрудников в своей базе данных.Вам нужно либо указать предикат в запросе на выборку, используя NSPredicate, и он должен выбирать только сотрудников, чья компания является компанией, которую вы выбрали в предыдущем представлении.Или подход, который я бы выбрал: вы выбираете объект Company, передаете его managedObjectId или сам managedObject своему контроллеру таблицы сотрудников и используете настройку, которую вы установили для извлечения сотрудников из него, Core Data будет заполнять любые ошибки и извлекатьсвязанные объекты сотрудников из базы данных для вас.

Если вы правильно настроите свои отношения, вызов selectedCompany.employees вернет NSSet, который вы можете использовать в качестве источника данных UITableViewController.

Редактировать

Если в отношениях потенциально имеется большое количество сотрудников, вы можете придерживаться подхода контроллера извлеченных результатов и настроить предикат соответствующим образом, чтобыполучить преимущества эффективности использования памяти, которые NSFetchedResultsController приносит в таблицу.

...