2012-04-05 11 views
2

私のアプリケーションにRestKitリリース/ 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は、データベースに2回(各ページエンティティごとに1つ)格納されます。しかし、私は同じIDを持つタグが一度しか格納されないようにそれらを区別したい。私は間違って何をしていますか?

+0

RestKitを使用して異なるオブジェクトで多対多のマッピングを行うことは可能ですか? @jeffarena? – Sbhklr

答えて

0

この問題は解決されました。 RestKitのバグだった。 https://github.com/RestKit/RestKit/issues/661を参照してください。 最新バージョンの開発ブランチをクローンして、動作するバージョンを取得してください。