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

Posted

技术标签:

【中文标题】FetchedResultsController 并在一个 UITableViewCell 中显示来自 3 个嵌套实体的数据【英文标题】:FetchedResultsController and displaying data from 3 nested entities in one UITableViewCell 【发布时间】:2014-05-09 04:50:08 【问题描述】:

谁能解释我如何在一个 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;

【问题讨论】:

【参考方案1】:

当您希望显示Alerts 时,在大多数简单情况下(如您的情况),您会将获取请求实体设置为@"Alert"

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

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

User 对象或 objectID 将从应用用户选择中为您所知,或者,如果您为每个用户有另一个唯一标识符(如 userName 属性),您可以将其包含在谓词中:

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

在大多数情况下,您要做的最后一件事是遍历一组 NSManagedObjects,因为它们会一个接一个地触发错误并给您带来非常糟糕的用户体验(尤其是在 cellForRow... 中)。

在需要将数据提供给视图之前获取您喜欢显示的数据。

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

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

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

显然,您必须更改 cellForRow... 方法以接受来自 FRC 的 Alert 对象。

【讨论】:

您好,谢谢您的回答,但这对我不起作用。你100%确定它应该工作吗?我想显示来自我的服务器的每个警报,其中包含以下详细信息:名称、someProperty 和 alert_content。 这应该可以。究竟什么“不起作用”?如果您想显示所有警报(不仅来自给定用户),则不应使用任何谓词。 也许可以,但在我的情况下不行。在我看来,我必须将 User 设置为获取请求实体而不是 Alert,然后在自定义方法中配置数据以显示在 tableViewCell 中。你怎么看? 您必须更好地解释您要完成的工作。如果您想显示Alerts,您将获取警报,这更有意义。此外,反向关系是一对一的,因此其他相关实体更容易访问。而且你仍然没有提到究竟是什么不起作用......

以上是关于FetchedResultsController 并在一个 UITableViewCell 中显示来自 3 个嵌套实体的数据的主要内容,如果未能解决你的问题,请参考以下文章

FetchedResultsController 中没有部分

如何将对象从 fetchedResultsController 到 Plist?

fetchedResultsController 对象的表视图部分

fetchedResultsController 和 Integer

将 fetchedResultsController 更改为 protected from private

将 fetchedResultsController 与 swift3 一起使用