核心数据详细信息视图与关系

我在核心数据实体上建立了一对多的关系 。 我试图显示相关数据的详细视图副本。 目前我有prepareforseague:与原始实体(Routines)合作的方法,但是我对如何显示链接实体(RoutinesDetails)感到很遗憾。

在此处输入图像描述

FBCDRoutineViewController

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Fetch the devices from persistent data store NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Routines"]; self.routines = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; [self.tableView reloadData]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"UpdateDevice"]) { NSManagedObject *selectedDevice = [self.routines objectAtIndex:[[self.tableView indexPathForSelectedRow] row]]; FBCDRoutineViewController *destViewController = segue.destinationViewController; destViewController.routines = selectedDevice; } 

FBCDRoutineDetailViewController

 - (NSManagedObjectContext *)managedObjectContext { NSManagedObjectContext *context = nil; id delegate = [[UIApplication sharedApplication] delegate]; if ([delegate performSelector:@selector(managedObjectContext)]) { context = [delegate managedObjectContext]; } return context; } - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Fetch the devices from persistent data store NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"RoutinesDetails"]; self.routines = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; } - (void)viewDidLoad { [[self navigationController] setNavigationBarHidden:NO animated:YES]; [super viewDidLoad]; // Do any additional setup after loading the view. if (self.routines) { [self.testLabel setText:[self.routines valueForKey:@"routinename"]]; } } 

FBCDRoutineDetailViewController

 @property (strong) NSManagedObject *routines; 

这是我第一次使用核心数据,我正在研究如何显示Details实体。 我接近它的工作吗? 如果没有,我可以直接指向我应该看的东西。

有什么建议么?

如果我正确理解您的问题,您希望显示与prepareForSegue传递的Routines对象相关的所有RoutinesDetails对象。

然后你将在FBCDRoutineDetailViewController声明两个属性:

 @property (strong) NSManagedObject *routines; // the passed object @property (strong) NSManagedObject *routineDetails; // the displayed details objects 

并像这样获取它们:

 NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"RoutinesDetails"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"routineinfo == %@", self.routines]; [fetchRequest setPredicate:predicate]; NSError *error; self.routineDetails = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

self.routineDetails现在是详细信息视图的数据源数组。

(备注:为了在表视图中显示Core Data请求的结果集,您可能还会考虑使用NSFetchedResultsController 。)

我想我看到了几个问题 – 主要与这些不同电话的时间有关。

我相信在调用prepareForSegue之前会在您的详细信息视图中调用viewDidLoad。 因此,viewDidLoad中的代码在设置之前会尝试显示有关详细信息项的数据。

然后viewDidAppear中的代码看起来要覆盖你在prepareForSegue中设置的值,这对我来说没有意义(虽然此时视图已经显示,并且它不会影响你试图在viewDidLoad中设置的标签)。

此外,executeFetchRequest:返回NSArray,而不是NSManagedObject,因此将获取结果分配给NSArray属性是一个不错的想法。