Ios 将一对多关系JSON填充到核心数据
在通过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
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表示,但所有其他条目均为空