一对多关系:无法保存

时间:2013-09-29 00:39:02

标签: ios objective-c core-data nsarray nsdictionary

我正在尝试与我拥有的一些数据创建一对多的关系。

我有一个Project和许多项目,我正在尝试设置控制器来保存它们,但这是我第一次使用一对多的关系而且我的脑袋即将爆炸。

这就是我的保存方法

- (void)writeProj:(NSArray *)recivedProData ItemsData:(NSArray *)itemsData  {
    // WRITE TO CORE DATA
    NSManagedObjectContext *context = [self managedObjectContext];    

    for (NSDictionary *dict in recivedProData) {
    Project *project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:self.managedObjectContext];        

        project.projectNumber = [dict valueForKey:@"ProjectNumber"];
        project.projectDescription = [dict valueForKey:@"Description"];
//        project.items = [dict valueForKey:@""]; // this is the relationship for project        
    }

    for (NSDictionary *dict in itemsData) {
    Items *items = [NSEntityDescription insertNewObjectForEntityForName:@"Items" inManagedObjectContext:self.managedObjectContext];

        items.description = [dict valueForKey:@"Description"];
        items.area = [dict valueForKey:@"Area"];
        items.stage = [dict valueForKey:@"Stage"];
//        items.project = [dict valueForKey:@""]; // this is the relationship for items                 
    }    

    NSError *error = nil;

    if (![__managedObjectContext save:&error]) {
        NSLog(@"There was an error! %@", error);
    }
    else {
        NSLog(@"created");
    }

    [Project addItemsObject:items];

    [__managedObjectContext saveOnSuccess:^{

        NSLog(@"You created a relationship");

    } onFailure:^(NSError *error) {

    NSLog(@"There was an error! %@", error);

    }];        
}

所以我有一个Project和多个Items,我只是不知道如何设置关键字段,以便将核心数据保存为一个项目和多个项目。

所以希望我的代码有意义。如果有人能够帮我弄清楚如何正确保存它,那将非常感激。

2 个答案:

答案 0 :(得分:1)

只需将items.project设置为等于您刚刚创建的项目NSManagedObject

items.project = project;

编辑:如果你只有一个项目,你应该将Project* project声明移到recivedProData for循环之外 - 你正在为每个字典制作一个项目,你说你只有一个项目永远。如果您只有一个项目,整个代码块都没有意义 - 为什么你有一个Project数据数组,而不只是一个字典?

答案 1 :(得分:0)

我想讨论您使用Core Data GUI编辑器配置的Core Data模型。我很好奇以下代码行中名为“Items”的多个实体:

Items *items = [NSEntityDescription insertNewObjectForEntityForName:@"Items" inManagedObjectContext:self.managedObjectContext];

也许只是语义问题。但是,多个实体名称可能表示您的Core Data模型中存在问题。我会尝试解释,但这是非常抽象的东西。

虽然实体可能具有代表事物集合的关系,但实体本身实际上并不是事物的集合;实体在模型中始终是一个单独的东西,应该在代码中(以及在命名方案中)对待它。

以下是我用文字描述你的模型的方法: Project实体是一个具有称为items的关系的单一事物。项目关系是项目实体的集合(一组)(即,一对多关系)。但是每个Item实体都是单一的。

GUI编辑器中的模型是否反映了此描述?