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

Ios FetchedResultsController并在一个UITableViewCell中显示来自3个嵌套实体的数据,ios,core-data,uitableview,nspredicate,nsfetchedresultscontroller,Ios,Core Data,Uitableview,Nspredicate,Nsfetchedresultscontroller,有人能告诉我如何在一个tableViewCell中显示通过关系连接的三个实体的数据吗 我有3个实体,分别是用户、设备和警报。关系:用户有许多设备,这些设备有许多警报 在我的AlertsTableViewController中,我希望显示每个具有user_name属性的警报,该属性包含在用户实体中。 我应该通过设置用户名或警报的实体来启动提取请求吗 - (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResu

有人能告诉我如何在一个tableViewCell中显示通过关系连接的三个实体的数据吗

我有3个实体,分别是用户、设备和警报。关系:用户有许多设备,这些设备有许多警报

在我的AlertsTableViewController中,我希望显示每个具有user_name属性的警报,该属性包含在用户实体中。 我应该通过设置用户名或警报的实体来启动提取请求吗

- (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;
}

当您想显示
警报时,在大多数简单的情况下(如您的),您会将获取请求实体设置为
@“警报”

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

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"device.user = %@",<User object or User objectID>];
在大多数情况下,您最不想做的事情就是循环一组
NSManagedObject
s,因为它们会一个接一个地触发故障,给您带来非常糟糕的用户体验(尤其是在
cellForRow…
)。

在需要将数据提供给视图之前,先获取要显示的数据。

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

fetchRequest.relationshipKeyPathsForPrefetching = @[@"device"];
这样
设备
将与
警报
对象一起获取


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

您好,谢谢您的回答,但这对我不起作用。你百分之百确定它会工作吗?我想显示我的服务器上的每个警报,包括详细信息,如:名称、someProperty和警报内容。这应该可以正常工作。到底什么“不起作用”?如果你想显示所有的警报(不仅仅是来自某个给定的用户),你不应该使用任何谓词。在我看来,我必须将用户设置为获取请求实体而不是警报,然后在自定义方法中配置数据以显示在tableViewCell中。你认为呢?你必须更好地解释你想要完成的是什么。如果您想显示
Alert
s,您将获取警报,这会更有意义。此外,反向关系是一个,因此其他相关实体更容易访问。你还没有提到什么不起作用。。。
fetchRequest.relationshipKeyPathsForPrefetching = @[@"device"];