将子实体加载到核心数据中的托管对象

Posted

技术标签:

【中文标题】将子实体加载到核心数据中的托管对象【英文标题】:Issue loading subentities to mangedobject in coredata 【发布时间】:2013-01-02 19:08:50 【问题描述】:

我认为这是错误的,它只加载一个汽车零件: 此方法采用两个数组,一个包含汽车名称,一个包含零件,创建一辆新车,并将汽车零件添加到其中,然后将汽车保存到核心数据中。 (目前不适合这种方式)

for (int i=0; i<[massiveArray count]; i++) 
    //create a new car and part
        Car*newCar =(Car*)[NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
        CarPart *part =[NSEntityDescription insertNewObjectForEntityForName:@"CarPart" inManagedObjectContext:[self managedObjectContext]];

//set car title to string title in array of titles
        [newCar setValue:[massiveArray objectAtIndex:i] forKey:@"name"];
        //go through car parts array and add all new parts for that specific car
        for (int i=0; i<[partNamesArray count]; i++) 
            [part setValue:[partNamesArray objectAtIndex:i] forKey:@"name"];
            [newCar addToCarPartObject:part];
//save each part??? I think this is wrong
            [self.managedObjectContext save:nil];
        
//Save new car
        [self.managedObjectContext save:nil];
    

【问题讨论】:

要记住的一点是,当您在 managedObjectContext 上调用 save 时,它​​会保存所有当前待处理的事务。它实际上不应该影响您看到的问题,但我建议只有一个保存调用位于两个循环之外。但这是一个问题,目前正在发生什么?代码是否运行并且只是不保存对象?编辑:为了澄清我的问题,内部 for 循环实际上是否多次触发? 内部 for 循环会触发不止一次(一辆车会有很多零件)。实际情况是每辆车只节省一个汽车零件,而不是全部。 【参考方案1】:

我知道这里发生了什么。

您需要在每个零件的核心数据中插入一个新零件对象。就像现在一样,您只制作一个部分对象,然后在 for 循环中覆盖它。您的代码应该类似于此...

for (int i=0; i<[massiveArray count]; i++) 
    //create a new car and part
    Car *newCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];

    //set car title to string title in array of titles
    [newCar setValue:[massiveArray objectAtIndex:i] forKey:@"name"];

    //go through car parts array and add all new parts for that specific car
    for (int i=0; i<[partNamesArray count]; i++) 
        CarPart *part =[NSEntityDescription insertNewObjectForEntityForName:@"CarPart" inManagedObjectContext:[self managedObjectContext]];
        [part setValue:[partNamesArray objectAtIndex:i] forKey:@"name"];
        [newCar addToCarPartObject:part];
    

//Save the entire context (all pending changes to cars and their parts)
[self.managedObjectContext save:nil];

正如我在上面的评论中所说,我建议将保存移到循环之外。

另一个更易于阅读代码的建议。在简单的 for 循环中枚举数组时,尝试类似...

for (NSString *carTitle in massiveArray) 
    /* Now do your stuff in here... 'carTitle' will be different during 
     * each pass of the loop. No need to increment an i variable or grab 
     * the object from the array on each pass. 
     */

【讨论】:

这成功了,重要的是在所有 for 循环之外保存 最重要的应该是在核心数据中为每个新条目创建一个新对象。循环外的保存应该只会提高执行速度,而您之前的执行速度在这方面在技术上并没有错。 它现在做对了,你是对的才是最重要的。现在认为执行速度快得离谱(这是更引人注目的)

以上是关于将子实体加载到核心数据中的托管对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将子上下文中的对象检索到另一个上下文中?

核心数据:托管对象和实体之间的区别?

继承托管对象

核心数据中的嵌套问题

iPhone核心数据递归关系

选项卡栏应用程序更新实体中的共享托管对象上下文不会传播到其他选项卡