首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Restkit多对多关系导致重复的对象。

Restkit多对多关系导致重复的对象。
EN

Stack Overflow用户
提问于 2012-04-05 07:26:50
回答 1查看 1.2K关注 0票数 2

对于我的应用程序,我使用的是RestKit application /0.10.0分支。我使用CoreData和RestKit的对象映射特性来加载/同步数据。我正在加载的XML数据看起来如下(简化):

代码语言:javascript
复制
<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>

域类、Page、标记如下所示:

代码语言:javascript
复制
@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

Page实体有许多标记,一个标记可以属于多个页面。所以我把双方的关系设为-很多。从页面到标记的删除规则是层叠的。从标签到页面都是无效的。

映射设置:

代码语言:javascript
复制
//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];

然后我像这样加载它:

代码语言:javascript
复制
[objectManager loadObjectsAtResourcePath:@"/" usingBlock:^(RKObjectLoader* loader) {
    loader.objectMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[NSMutableDictionary class]];
}];

对象被正确地加载和映射,但是ID 16和ID 20的标记被两次存储在数据库中(每个页面实体一个)。但是我希望它们是不同的,这样具有相同ID的标签只能存储一次。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-25 10:01:29

这个问题已经解决了。这是RestKit中的一个bug。请参阅https://github.com/RestKit/RestKit/issues/661克隆开发分支的最新版本,以获得工作版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10024288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档