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

时间:2013-07-09 16:38:08

标签: ios core-data

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

enter image description here

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实体。我接近它的工作吗?如果没有,我可以直接指向我应该看的东西。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

然后你会在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现在是详细信息视图的数据源数组。

(备注:为了在表格视图中显示核心数据请求的结果集, 您也可以考虑使用NSFetchedResultsController。)