2

アプリケーションにRestKitrelease/0.10.0ブランチを使用しています。CoreDataとRestKitのオブジェクトマッピング機能を使用してデータをロード/同期しています。ロードしているXMLデータは次のようになります(簡略化)。

<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のプロパティ

マッピングの設定:

//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]];
}];

オブジェクトは適切にロードおよびマッピングされますが、ID16およびID20のタグはデータベースに2回保存されます(ページエンティティごとに1つ)。ただし、同じIDのタグが1回だけ保存されるように、それらを区別する必要があります。私は何が間違っているのですか?

4

1 に答える 1

0

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

于 2012-04-25T10:01:29.790 に答える