有人可以解释一下我如何在一个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;
}
答案 0 :(得分:0)
当您想要显示Alert
时,在大多数情况下(例如您的),您会将获取请求实体设置为@"Alert"
。
要仅选择属于给定用户的Alert
,您需要为获取请求定义谓词:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"device.user = %@",<User object or User objectID>];
您可以从应用用户选择中了解User
对象或objectID
,或者,如果您有每个用户的另一个唯一标识符(例如userName
属性),则可以在你的谓语中加入:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"device.user.name = %@",userNameVariable];
在大多数情况下,你要做的最后一件事是循环遍历一组NSManagedObject
,因为它们将逐一触发故障并给你一个非常糟糕的用户体验(特别是在cellForRow...
)。
获取您想要显示的数据,然后再将其提供给视图。
修改强>
本着这种精神,如果您想在someProperty
中显示AlertsTableViewController
值,您还应该添加:
fetchRequest.relationshipKeyPathsForPrefetching = @[@"device"];
这样Device
将与Alert
对象一起提取。
显然,您必须将cellForRow...
方法更改为接受FRC中的Alert
个对象。