Ios 一对多关系:无法保存

Ios 一对多关系:无法保存,ios,objective-c,core-data,nsarray,nsdictionary,Ios,Objective C,Core Data,Nsarray,Nsdictionary,我试图用我掌握的一些数据建立一对多的关系 我有一个项目和许多项目,我正试图设置控制器来保存它们,但这是我第一次使用一对多关系,我的脑袋快要爆炸了 这就是我的保存方法 - (void)writeProj:(NSArray *)recivedProData ItemsData:(NSArray *)itemsData { // WRITE TO CORE DATA NSManagedObjectContext *context = [self managedObjectContex

我试图用我掌握的一些数据建立一对多的关系

我有一个
项目和许多项目,我正试图设置控制器来保存它们,但这是我第一次使用一对多关系,我的脑袋快要爆炸了

这就是我的保存方法

- (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);

    }];        
}
因此,我有一个
项目
和许多
项目
,我只是不知道如何设置关键字段,以便它们作为一个项目和许多项目保存到核心数据中


所以希望我的代码是有意义的。如果有人能帮我找出如何正确保存它,我将不胜感激。

只需将items.project设置为与您刚才创建的项目相同即可

items.project = project;

编辑:如果您只有一个项目,那么应该将
project*project
声明移到
recivedProData
for循环之外——您为每个字典创建一个项目,并且您说您只有一个项目。如果您只有一个项目,那么整个代码块就毫无意义了——为什么您有一个
project
数据数组,而不仅仅是一个字典?

我想讨论一下您的核心数据模型,即您使用核心数据GUI编辑器配置的模型。我对以下代码行中名为“Items”的多个实体感到好奇:

Items *items = [NSEntityDescription insertNewObjectForEntityForName:@"Items" inManagedObjectContext:self.managedObjectContext];
也许这只是一个语义问题。然而,多个实体名称可能表明核心数据模型中存在问题。我会尽力解释,但这是相当抽象的东西

尽管一个实体可能有一种表示事物集合的关系,但该实体本身并不是真正的事物集合;实体在模型中始终是一个单独的东西,在代码中(以及在命名方案中)应该这样对待

以下是我如何用文字描述您的模型: 项目实体是一个具有称为items的关系的单一对象。项目关系是项目实体的集合(一组)(即一对多关系)。但每个项目实体都是一个单独的东西


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

好的。然后将保存添加到循环的项中。。这一切都合乎逻辑。。希望它能工作我不认为你需要将saveOnSuccess:call放入for循环——将其保存到硬盘上几次是没有效率的,而不是像现在这样保存到硬盘上一次(核心数据会将更改保存在内存中,直到你关闭应用程序或放弃它们),请记住,iOS设备上的闪存在耗尽之前只能进行一定量的写入。还是我完全误解了你写的东西?对不起,我不是太清楚我说的是这行代码[project addItemsObject:items];不是拯救。。save仍在循环之外。。因此,如果我正在使用您的项,我甚至需要此代码。project=project;?哪种代码?saveOnSuccess:?如果你想让数据在用户关闭应用程序后保持不变,你需要保留它。你知道如何将项目和相关项目读取到数组中吗?我想这就解释了我在做什么。我有一个项目,其中有很多项目。。items是项的集合。这有意义吗?这就是我试图实现的,我非常确定我的数据模型是正确的,因为我从项目到项目有一对多的关系。。然而,我不确定我的代码是否反映了这一点,因为我以前从未尝试过类似的事情,我依赖于我在编写和读取单一对象方面的经验。你能从GUI编辑器中截取你的数据模型并发布它吗?正如其他人所说,您发布的代码存在一些问题,但首先让我们确定您的模型是正确的。