Ios FetchedResultsController并在一个UITableViewCell中显示来自3个嵌套实体的数据
有人能告诉我如何在一个tableViewCell中显示通过关系连接的三个实体的数据吗 我有3个实体,分别是用户、设备和警报。关系:用户有许多设备,这些设备有许多警报 在我的AlertsTableViewController中,我希望显示每个具有user_name属性的警报,该属性包含在用户实体中。 我应该通过设置用户名或警报的实体来启动提取请求吗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
- (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"];