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】:当您希望显示Alert
s 时,在大多数简单情况下(如您的情况),您会将获取请求实体设置为@"Alert"
。
要仅选择属于给定用户的Alert
s,您需要为您的获取请求定义一个谓词:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"device.user = %@",<User object or User objectID>];
User
对象或 objectID
将从应用用户选择中为您所知,或者,如果您为每个用户有另一个唯一标识符(如 userName
属性),您可以将其包含在谓词中:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"device.user.name = %@",userNameVariable];
在大多数情况下,您要做的最后一件事是遍历一组 NSManagedObject
s,因为它们会一个接一个地触发错误并给您带来非常糟糕的用户体验(尤其是在 cellForRow...
中)。
在需要将数据提供给视图之前获取您喜欢显示的数据。
编辑:
本着这种精神,如果您想在 AlertsTableViewController
中显示 someProperty
值,您还应该添加:
fetchRequest.relationshipKeyPathsForPrefetching = @[@"device"];
这样Device
将与Alert
对象一起被获取。
显然,您必须更改 cellForRow...
方法以接受来自 FRC 的 Alert
对象。
【讨论】:
您好,谢谢您的回答,但这对我不起作用。你100%确定它应该工作吗?我想显示来自我的服务器的每个警报,其中包含以下详细信息:名称、someProperty 和 alert_content。 这应该可以。究竟什么“不起作用”?如果您想显示所有警报(不仅来自给定用户),则不应使用任何谓词。 也许可以,但在我的情况下不行。在我看来,我必须将 User 设置为获取请求实体而不是 Alert,然后在自定义方法中配置数据以显示在 tableViewCell 中。你怎么看? 您必须更好地解释您要完成的工作。如果您想显示Alert
s,您将获取警报,这更有意义。此外,反向关系是一对一的,因此其他相关实体更容易访问。而且你仍然没有提到究竟是什么不起作用......以上是关于FetchedResultsController 并在一个 UITableViewCell 中显示来自 3 个嵌套实体的数据的主要内容,如果未能解决你的问题,请参考以下文章
FetchedResultsController 中没有部分
如何将对象从 fetchedResultsController 到 Plist?
fetchedResultsController 对象的表视图部分
fetchedResultsController 和 Integer