2012-04-05 66 views
2

我爲我的應用程序使用RestKit release/0.10.0分支。我正在使用CoreData和RestKit的對象映射功能來加載/同步數據。我加載的外觀如下XML數據(簡化):Restkit多對多關係會導致重複的對象

<iphoneSync> 
<time>12-04-03 16:47</time> 
<pages> 
    <page id="177"> 
     <title> 
      Foo 
     </title> 
     <meta> 
      <tags> 
       <tag type="undef" id="16">Lorem</tag> 
       <tag type="undef" id="20">Ipsum</tag> 
      </tags> 
     </meta>   
    </page> 
    <page id="580"> 
     <title> 
      Bar 
     </title> 
     <meta> 
      <tags> 
       <tag type="undef" id="16">Lorem</tag> 
       <tag type="undef" id="20">Ipsum</tag> 
       <tag type="" id="46">Abc</tag> 
       <tag type="symptom" id="47">Cde</tag> 
      </tags> 
     </meta> 
    </page> 
</pages> 

域類標籤如下所示:

@interface Page : NSManagedObject 
@property (nonatomic, strong) NSNumber * id; 
@property (nonatomic, strong) NSString * title; 
@property (nonatomic, strong) NSSet *tags; 
@end 

@interface Tag : NSManagedObject 
@property (nonatomic, strong) NSNumber * id; 
@property (nonatomic, strong) NSString * name; 
@property (nonatomic, strong) NSString * type; 
@property (nonatomic, strong) NSSet *pages; 
@end 

頁實體有很多標籤和標籤可以屬於多個頁面。所以我把雙方的關係設定爲To-many。從頁面到標籤的刪除規則是級聯的。從標籤到頁面它是無效的。

CoreData properties

映射設置:

//Tag mapping 
RKManagedObjectMapping* tagMapping = [RKManagedObjectMapping mappingForClass:[Tag class] inManagedObjectStore:[RKManagedObjectStore defaultObjectStore]]; 
tagMapping.setDefaultValueForMissingAttributes = YES; 
tagMapping.primaryKeyAttribute = @"id"; 
[tagMapping mapKeyPathsToAttributes:@"type",@"type",@"text",@"name",@"id",@"id", nil]; 

//Page mapping 
RKManagedObjectMapping* pageMapping = [RKManagedObjectMapping mappingForClass:[Page class] inManagedObjectStore:[RKManagedObjectStore defaultObjectStore]];  
pageMapping.primaryKeyAttribute = @"id"; 
[pageMapping mapKeyPathsToAttributes:@"id",@"id",@"title",@"title",nil]; 
[pageMapping mapKeyPath:@"meta.tags.tag" toRelationship:@"tags" withMapping:tagMapping]; 
pageMapping.setNilForMissingRelationships = YES; 
pageMapping.setDefaultValueForMissingAttributes = YES; 

//Root mapping 
RKObjectMapping* rootMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]]; 
[rootMapping mapKeyPath:@"iphoneSync.pages.page" toRelationship:@"pages" withMapping:pageMapping]; 

//RKObjectManager 
RKManagedObjectStore* mainManagedObjectStore = [RKManagedObjectStore objectStoreWithStoreFilename:OBJECT_STORE_FILE]; 
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL]; 
[RKObjectManager setSharedManager:objectManager]; 
objectManager.acceptMIMEType = RKMIMETypeXML; 
objectManager.serializationMIMEType = RKMIMETypeXML; 
objectManager.objectStore = mainManagedObjectStore; 
objectManager.objectStore.cacheStrategy = [RKInMemoryManagedObjectCache new]; 
objectManager.client.cachePolicy = RKRequestCachePolicyNone; 

[objectManager.mappingProvider addObjectMapping:rootMapping];  
[objectManager.mappingProvider addObjectMapping:pageMapping]; 
[objectManager.mappingProvider addObjectMapping:tagMapping]; 

然後我加載它是這樣的:

[objectManager loadObjectsAtResourcePath:@"/" usingBlock:^(RKObjectLoader* loader) { 
    loader.objectMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[NSMutableDictionary class]]; 
}]; 

的對象被加載和正確映射,但與ID 16和ID標籤20在數據庫中存儲兩次(每個頁面實體一個)。但我希望它們是不同的,以便具有相同ID的標籤只存儲一次。我究竟做錯了什麼?

+0

它甚至可以使用RestKit與不同對象進行多對多映射嗎? @jeffarena? – Sbhklr 2012-04-10 15:30:04

回答