我正在尝试使用RestKit将本地XML文件解析为CoreData。我已经使用在线REST服务成功完成了这项工作,但解析本地文件或仅解析XML似乎是一个完全不同的野兽。
首先我使用一个名为CoreDataHandler的类,它只封装了所有默认的CoreData内容。所以它基本上是xcode在AppDelegate中提供的,放入一个单独的类。
到目前为止我做了什么:
CoreDataHandler* handler = [CoreDataHandler instance];
RKManagedObjectMappingOperationDataSource* dataSource = [[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:handler.managedObjectContext cache:sharedManager.managedObjectStore.managedObjectCache];
dataSource.operationQueue = [NSOperationQueue new];
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"Seed_010000" ofType:@"xml"];
NSData *sourceObject = [NSData dataWithContentsOfFile:filePath];
RKObjectMapping* mapping = [self mapCourses];
RKMappingOperation* operation = [[RKMappingOperation alloc] initWithSourceObject:sourceObject destinationObject:nil mapping:mapping];
operation.dataSource = dataSource;
NSError* error = nil;
[operation performMapping:&error];
if( error == nil ) {
NSLog(@"%@", [operation mappingInfo]);
[handler saveContext];
} else {
NSLog(@"error: %@", error);
}
这里创建了映射:
+ (RKObjectMapping*) mapCourses {
RKEntityMapping *courseMapping = [RKEntityMapping mappingForClass:[Course class]];
[courseMapping addAttributeMappingsFromDictionary:@{ @"Name.text" : @"name" }];
RKEntityMapping* sectionMapping = [RKEntityMapping mappingForClass:[Section class]];
[sectionMapping addAttributeMappingsFromDictionary:@{ @"order" : @"order",
@"Icon.text" : @"icon",
@"Name.text" : @"name",
@"Description.text" : @"desc" }];
[courseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Sections" toKeyPath:@"sections" withMapping:sectionMapping]];
return courseMapping;
}
XML文件如下所示:
<MyProject>
<Courses>
<Course>
<Name>Name of the Course</Name>
<Sections>
<Section order="0">
<Icon>ICON_00</Icon>
<Name>Name of the Section</Name>
<Description>Description of the Section</Description>
</Section>
</Sections>
</Course>
</Courses>
</MyProject>
我得到的错误是:
2015-10-20 12:01:37.515 Training[16058:5400082] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSConcreteData 0x7fdf39f2b650> valueForUndefinedKey:]: this class is not key value coding-compliant for the key Sections.'
堆栈跟踪指向[operation performMaping:&amp; error];线。
我希望任何人都能对此有所了解。
编辑:我改变了问题,因为第一个错误(关于错误的初始化是由于我自己的愚蠢。我使用RKObjectMapping而不是RKEntityMapping,你在使用CoreData时必须使用它。答案 0 :(得分:1)
你看起来有几个问题。您似乎正在使用2个不同的托管对象上下文,一个来自其余工具包堆栈,另一个来自您自己的堆栈。您不应该创建自己的任何上下文。
对于您的错误,这是因为您正在使用RKObjectMapping
,因为您使用的是核心数据,因此您应该使用RKEntityMapping
。