Ios 将一对多关系JSON填充到核心数据

Ios 将一对多关系JSON填充到核心数据,ios,json,core-data,Ios,Json,Core Data,在通过JSON填充一对多核心数据模型方面存在问题 背景: Two Entities: WorkoutType Attributes: -workoutType Relationship: workouts Destination: WorkoutSet Inverse: workoutType WorkoutSet Attributes: -workoutName Relationship: wo

在通过JSON填充一对多核心数据模型方面存在问题

背景:

Two Entities:

    WorkoutType
    Attributes:
        -workoutType
    Relationship: workouts
    Destination: WorkoutSet
    Inverse: workoutType

    WorkoutSet
    Attributes:
        -workoutName
    Relationship: workoutType
    Destination: WorkoutType
    inverse: workouts
以下是我的JSON:

[
  { "workoutType": "Strength",
           "workouts":
            [   { "workoutName": "Strength 1"},
                { "workoutName": "Strength 2"},
                { "workoutName": "Strength 3"},
                { "workoutName": "Strength 4"}
                ],
  },
  { "workoutType": "Core",
           "workouts":
            [   { "workoutName": "Core 1"},
                { "workoutName": "Core 2"},
                { "workoutName": "Core 3"},
                { "workoutName": "Core 4"}
                ],
 }
]
JSON解析正确,问题是每个训练类型核心和强度应该有4个训练强度1、强度2、。。核心1,核心2

在查看创建的sqlite数据库后,我得到的是Strength有3次训练,Core有5次训练。每次我编译代码时,数字都会改变

我使用的代码如下:

    NSString* thirdDataPath = [[NSBundle mainBundle] pathForResource:@"Workouts" ofType:@"json"];
    NSArray* Workouts = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:thirdDataPath]
                                                       options:kNilOptions
                                                         error:&err];
    NSLog(@"Imported Workouts: %@", Workouts);

    [Workouts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        WorkoutType *workoutType = [NSEntityDescription
                          insertNewObjectForEntityForName:@"WorkoutType"
                          inManagedObjectContext:context];
        workoutType.workoutType = [obj objectForKey:@"workoutType"];



        NSArray *workoutsArray = [obj objectForKey:@"workouts"];
        [workoutsArray enumerateObjectsUsingBlock:^(id workoutsObj, NSUInteger workoutsIdx, BOOL *workoutsStop) {


            WorkoutSet *workoutSet = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"WorkoutSet"
                                      inManagedObjectContext:context];


            //Not Sure if the line below is correct, also not sure if i should be setting the relationship here too something like workoutSet.workouts = .... 
            workoutSet.workoutType = workoutType;
            workoutSet.workoutName = [workoutsObj objectForKey:@"workoutName"];
        }];

        NSError *error;
        if (![context save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        }

    }];
请放轻松,我是新手。在代码中,我添加了一条注释,我认为我可能犯了错误


我将非常感谢您的帮助。谢谢。

我注意到的一件事是,您应该通过调用save:从EnumerateObjects中退出,然后使用SingBlock:调用。不需要连续保存8次。完成所有插入操作后,请执行一次保存。这不会解决您所问的问题,但它会使您的代码稍微更有效率。而且,在检查了您的代码几次之后,我没有发现任何问题。我想知道您是否在数据库中看到以前运行的一些旧数据。您是否尝试删除数据库并重新运行?我看不到你应用程序的其余代码,但每次运行此代码时,你似乎都会不断积累新的实体。是的,每次编译时,我都会删除以前创建的数据库。此外,在分析sqlite数据库时,每个workoutName都应该与一个WorkoutType相关。在数据库中,只有强度4和岩芯4与其对应的修井类型强度和岩芯相关,这以数字1和2表示,但所有其他条目均为空