使用RestKit 0.25将本地XML解析为CoreData

时间:2015-10-20 10:05:56

标签: ios objective-c xml core-data restkit

我正在尝试使用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时必须使用它。

1 个答案:

答案 0 :(得分:1)

你看起来有几个问题。您似乎正在使用2个不同的托管对象上下文,一个来自其余工具包堆栈,另一个来自您自己的堆栈。您不应该创建自己的任何上下文。

对于您的错误,这是因为您正在使用RKObjectMapping,因为您使用的是核心数据,因此您应该使用RKEntityMapping