【问题标题】:FetchedResultsController and displaying data from 3 nested entities in one UITableViewCellFetchedResultsController 并在一个 UITableViewCell 中显示来自 3 个嵌套实体的数据
【发布时间】: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;
}

【问题讨论】:

    标签: ios core-data uitableview nspredicate nsfetchedresultscontroller


    【解决方案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,您将获取警报,这更有意义。此外,反向关系是一对一的,因此其他相关实体更容易访问。而且你仍然没有提到究竟是什么不起作用......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多