私のアプリケーションに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に設定しました。ページからタグへの削除ルールはカスケードです。タグからページへは無効になります。
マッピングの設定:
//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を持つタグが一度しか格納されないようにそれらを区別したい。私は間違って何をしていますか?
RestKitを使用して異なるオブジェクトで多対多のマッピングを行うことは可能ですか? @jeffarena? – Sbhklr