核心数据一对多简单示例

时间:2013-07-21 05:26:16

标签: ios core-data relationships

尝试与核心数据建立一对多的关系而进展甚微。

试图制作一个简单的核心数据示例。

实体A =类型:  typeName = String。

实体B =常规:  routineName = String。

关系:类型有很多例程。

我有一些视图控制器。

  1. TypeViewController(表视图控制器列出实体A中的所有类型。

  2. AddTypeViewController(View控制器通过typeTextField向实体添加类型。这是从TypeViewController中的添加按钮推送的)

  3. RoutineViewController(从TypeViewController中选择类型时推送的表视图控制器。列出与所选类型关联的实体B中的例程。

  4. AddRoutineViewController(视图控制器通过routineNameTextField将例程添加到实体B。这是从RoutineView控制器中的添加按钮推送的。

  5. 我开始实现第一个实体,并设法让前2个视图控制器正常工作。 (能够在第一个视图控制器上添加类型并查看它们。

    一旦我创建了第二个实体并链接了关系(也是反向关系),第一部分就停止了工作。

    Q值。我是否必须更改视图控制器1中的数据获取方式? (在此视图控制器中,我只从实体A获取数据)。

    Q值。是否可以单独添加数据? (从视图控制器2添加类型数据,并从视图控制器4添加例程数据。)

    Q值。在视图控制器4中保存数据时......

    - (IBAction)savePressed:(id)sender {
    
    RoutinePlan *routinePlan = [[RoutinePlan alloc] initWithEntity:[NSEntityDescription entityForName:@"RoutinePlan" inManagedObjectContext:self.managedObjectContext]
                                    insertIntoManagedObjectContext:self.managedObjectContext];
    
    
    [routinePlan setValue:self.rNameTextField.text forKey:@"rName"];
    
    
    **How to add this routine to the selected type**
    
    
    NSError *savingError;
    if (![self.managedObjectContext save:&savingError])NSLog(@"Error saving: %@", savingError);
    
    
    }
    

    感谢您的帮助。如果需要更多信息,我可以提供......

    也有人知道一对多关系的基本例子吗?

    编辑:

    *** TypeViewController.m的代码片段

    - (NSManagedObjectContext *)managedObjectContext{
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;}
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString:@"current Type Selected"]) {
        NSManagedObject *selectedRoutine = [self.routineTypeArray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
        RoutinePlanViewController *destViewController = segue.destinationViewController;
        destViewController.routineTypeObject = selectedRoutine;
    }}
    - (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    // Fetch the devices from persistent data store
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Type"];
    self.routineTypeArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
    [self.tableView reloadData];}
    

    ** AddTypeViewController.m的代码片段

    - (NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;}
    - (IBAction)savePressed:(id)sender {
    NSManagedObjectContext *context = [self managedObjectContext];
    NSManagedObject *newRoutine = [NSEntityDescription insertNewObjectForEntityForName:@"Type" inManagedObjectContext:context];
    [newRoutine setValue:self.rTypeTextField.text forKey:@"rType"];    
    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }
    [self dismissViewControllerAnimated:YES completion:nil];    }
    

    ** RoutineViewController.m的代码片段

    @synthesize routineTypeObject;
    - (NSManagedObjectContext *)managedObjectContext{
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
    }
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
    if ([[segue identifier] isEqualToString:@"current Type Selected"]) {
        AddRoutineViewController *destViewController = segue.destinationViewController;
        destViewController.routineTypeObject = routineTypeObject;
    }
    }
    - (void)viewDidAppear:(BOOL)animated
    {
    [super viewDidAppear:animated];
    // Fetch the devices from persistent data store
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Routine"];
    self.routineArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];    
    [self.tableView reloadData];
    }
    

    ** AddRoutineViewController.m的代码片段

    @synthesize routineTypeObject;
    - (NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
    }
    - (IBAction)savePressed:(id)sender {
    Routine *routinePlan = [[Routine alloc] initWithEntity:[NSEntityDescription entityForName:@"Routine" inManagedObjectContext:self.managedObjectContext]
                                    insertIntoManagedObjectContext:self.managedObjectContext];
    [routinePlan setValue:self.rNameTextField.text forKey:@"rName"];
    
    **Error
    [Routine.Type = routineTypeObject];
    
    NSError *savingError;
    if (![self.managedObjectContext save:&savingError])NSLog(@"Error saving: %@", savingError);
    }
    

1 个答案:

答案 0 :(得分:0)

  

Q值。我是否必须更改视图控制器1中的数据获取方式? (在此视图控制器中,我只从实体A获取数据)。

不,你不应该(但你没有提供有关你目前如何做或任何错误的信息)。

  

Q值。是否可以单独添加数据? (从视图控制器2添加类型数据,并从视图控制器4添加例程数据。)

是的,只要您引用正在编辑的type并添加managedObjectContext,就没有基于视图控制器的限制。

  

Q值。在视图控制器4中保存数据时......

您需要添加配置关系的行。最简单的方法是:

routinePlan.type = type;

(其中routinePlan具有名为type的关系,并且您具有要编辑的实例。使用点表示法还要求您具有托管对象子类。)