FetchedResultsController并在一个UITableViewCell中显示来自3个嵌套实体的数据

时间:2014-05-09 04:50:08

标签: ios core-data uitableview nspredicate nsfetchedresultscontroller

有人可以解释一下我如何在一个tableViewCell数据中显示三个通过关系连接的实体?

我有3个实体,让它成为用户,设备和警报。关系:用户拥有许多设备,这些设备有许多警报。

在我的AlertsTableViewController中,我希望显示包含在User实体中的user_name属性的每个警报。 我应该通过为名称User或Alert设置实体来启动我的获取请求吗?

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

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"????????" inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];


// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:12];



NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:@"Alerts"];

aFetchedResultsController.delegate = self;

self.fetchedResultsController = aFetchedResultsController;

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) 
    {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

return _fetchedResultsController;

}

我的TableView方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"AlertsTableViewCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
User *u = [[self fetchedResultsController] objectAtIndexPath:indexPath];
//I know how to display User with details of devices by looping nsset but how to display every alerts with User.name? 
for (Device *device in u.devices) {

    [cell.textLabel setText:device.someProperty];
}


return cell;
}

datemodel

1 个答案:

答案 0 :(得分:0)

当您想要显示Alert时,在大多数情况下(例如您的),您会将获取请求实体设置为@"Alert"

要仅选择属于给定用户的Alert,您需要为获取请求定义谓词:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"device.user = %@",<User object or User objectID>];

您可以从应用用户选择中了解User对象或objectID,或者,如果您有每个用户的另一个唯一标识符(例如userName属性),则可以在你的谓语中加入:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"device.user.name = %@",userNameVariable];

在大多数情况下,你要做的最后一件事是循环遍历一组NSManagedObject,因为它们将逐一触发故障并给你一个非常糟糕的用户体验(特别是在cellForRow... )。

获取您想要显示的数据,然后再将其提供给视图。

修改
本着这种精神,如果您想在someProperty中显示AlertsTableViewController值,您还应该添加:

fetchRequest.relationshipKeyPathsForPrefetching = @[@"device"];

这样Device将与Alert对象一起提取。

显然,您必须将cellForRow...方法更改为接受FRC中的Alert个对象。