2014-12-13 41 views
0

正如问题标题中提到的,由于某些原因,在检查sqlite数据库时,关系设置不正确。RestKit导入JSON不会设置关系

我正在导入两个资源(书籍和章节),每个资源都在一个一对多结构的JSON文件中。这是一个例子JSON:

books.json:  [ { "id": 1, "number": 12345, "name": "Book 1" } ] 
chapters.json: [ { "id": 1, "bookId": 1, "name": "Chapter 1" } ] 

我已经设置了以下映射:

RKEntityMapping *bookMapping = [RKEntityMapping mappingForEntityForName:@"Book" 
    inManagedObjectStore:managedObjectStore]; 
bookMapping.identificationAttributes = @[ @"id" ]; 
[bookMapping addAttributeMappingsFromArray:[Book attributesArray]]; // [@"id", @"number", @"name"] 

RKEntityMapping *chapterMapping = [RKEntityMapping mappingForEntityForName:@"Chapter" 
    inManagedObjectStore:managedObjectStore]; 
chapterMapping.identificationAttributes = @[ @"id" ]; 
[chapterMapping addAttributeMappingsFromArray:[Chapter attributesArray]]; // [@"id", @"bookId", @"name"] 

,当然还有连接:

[chapterMapping addConnectionForRelationship:@"book" connectedBy:@{ @"bookId": @"id" }]; 

这里是导入两个JSON的一部分文件:

RKManagedObjectImporter *importer = [[RKManagedObjectImporter alloc] initWithManagedObjectModel:managedObjectStore.managedObjectModel storePath:path]; 

NSString *bookJsonPath = [NSString stringWithFormat:@"%@/%@/books.json", [self getDocumentsPath], @"seeds"]; 
[importer importObjectsFromItemAtPath:bookJsonPath 
          withMapping:bookMapping 
           keyPath:nil 
           error:&error]; 

// [[importer managedObjectContext] saveToPersistentStore:&error]; 

NSString *chapterJsonPath = [NSString stringWithFormat:@"%@/%@/chapters.json", [self getDocumentsPath], @"seeds"]; 
[importer importObjectsFromItemAtPath:chapterJsonPath 
          withMapping:chapterMapping 
           keyPath:nil 
           error:&error]; 

success = [importer finishImporting:&error]; 

if (success) { 
    [importer logSeedingInfo]; 

    NSLog(@"Finished seeding!"); 
} 

导入过程完全正常,但书籍外键列中的章节全部为NULL。日志还显示:

Caching instances of Entity 'Book' by attributes 'guid' 
Imported 551 objects from file at path ... (books) 
Caching instances of Entity 'Chapter' by attributes 'guid' 
Imported 1908 objects from file at path ... (chapters) 
Starting 1908 connection operations ... 
A seed database has been generated 

哪种指示它开始创建连接,但什么也没有发生。

  

更新14年12月15日: 的两个主要错误是:

  1. 我使用了保留关键字id为(而不是说​​)属性和
  2. 我有一个在我的外键映射中犯了一个愚蠢的错误!在章节中出现的外键是book,我的映射预期为bookId。尴尬!我改变了服务器,正确地返回bookId作为外键,现在它工作。

这种方式只有连接是足够的!无需添加RKRelationShipMappings。

回答

0

您应该在Book和Chapter之间创建关系,而不仅仅是一个连接。

  1. 章应具有与Book对象一对多的关系,这样 enter image description here

  2. 你应该章和书籍,这样的事情之间建立关系映射:

    我没有尝试执行你的代码,但你必须在Book和Chapter之间创建关系映射。如果ID为1的书籍不存在,连接将不会在Book表格中插入新记录。

所以,IMO必须添加这样的事情:

RKEntityMapping* bookIDMapping = [RKEntityMapping mappingForEntityForName:@"Book" 
                inManagedObjectStore:managedObjectStore]; 

bookIDMapping.identificationAttributes = @["bookId"]; 

[chapterMapping addPropertyMapping:[RKRelationshipMapping 
            relationshipMappingFromKeyPath:@"bookId" 
         toKeyPath:@"bookId" 
         withMapping:bookIDMapping]]; 
  • 的最后一件事是关于这一行:

    chapterMapping.identificationAttributes = @ [@“id”];

  • 如果您调用了属性ID,请将其重命名为bookId/chapterId。 Objective-C中的Id是一个关键词,它意味着编译器会在这里期待任何类型的对象。

    就像我说的,我没有检查我在这里写的部分代码,但我认为它会帮助你。 你会明白这一点:)

    +0

    谢谢你用'id'字段指出我的错误。我仔细检查了我的属性映射,并将其重命名为“guid”。现在它的工作! – codepushr 2014-12-13 17:34:59