我有一个节点详细信息webservice,如下所示:
<nid>23</nid>
<timestamp>1345634</timestamp>
<name>Some Name</name>
<synonym_nids>
<item>
45
</item>
<item>
85
</item>
</synonym_nids>
我已经使用我的RKManagedObjectMapping
子类创建了NSManagedObject
,它应该维护上述结构。上面提到的nid(<nid>
和<synonym_nids>
)都是唯一的。同义词集合本身应具有唯一的标识符。
我可以在使用API <nid>
映射到使用NSManagedObject子类的主级别xml映射期间将-setPrimaryKeyAttribute
标记为唯一。我会检查本地对象中timestamp的值,并将其与列表API中返回的<timestamp>
进行比较,并仅在时间戳过期时将对象标记为“脏”。我接下来只获取那些设置了“脏位”的节点的细节 - 上面显示的XML是详细API的摘录。现在,当设置脏位并且完成提取细节API时,我最终在关系集中添加了多个同义词ID,因为在Restkit中没有机制(根据我的研究直到现在)来检查nid是否为45和85(在这种情况下)已存在于关系集中。因此,当每次将对象标记为“脏”时,自然Restkit最终会为nid 45和85添加多个条目。此外,由于没有使用coredata在NSNumber
(一对多)关系中直接输入NSSet
的固有机制,因此我在NSNumber
周围创建了一个包装器对象{{1} } subclass将其添加到关系集中。
模型对象如下所示:
NSManagedObject
如何有效处理此案件? Restkit中是否有固有的功能来处理这种情况?
更新
NGInteger64对象的结构:
@interface NGArticle : NSModelBase <NGArticleObjectMappingProtocol>
@property (nonatomic, retain) NSNumber * nodeID; // <nid>
@property (nonatomic, retain) NSString * prominentCommonName; // <name>
@property (nonatomic, retain) NSDate * lastChanged; // <timestamp>
@property (nonatomic, retain) NSSet *lookAlike; // <synonym_nids>
@end
@interface NGArticle (CoreDataGeneratedAccessors)
-(void)addLookAlikeObject:(NGInteger64*)value;
-(void)removeLookAlikeObject:(NGInteger64*)value;
-(void)addLookAlike:(NSSet*)values;
-(void)removeLookAlike:(NSSet*)values;
@end
请注意,@interface NGInteger64:NGModelBase
@property (nonatomic, retain) NSNumber *number; // This number is of Integer 64 type which is set in managed object model's xcdatamodel file.
@end
是NGModelBase
的子类,因此NSManagedObject
和NGArticle
也是NGInteger64
的子类。
答案 0 :(得分:1)
Restkit最终每次为nid 45和85添加多个条目
这意味着您没有教过RestKit如何查找指定标识符的实体的现有实例。在这种情况下,RestKit正在创建新对象并将它们添加到关系中。
我可以在映射期间将其标记为唯一
是的,您必须这样做才能避免重复。指定给setPrimaryKeyAttribute
的名称应该是实体的属性(而不是XML中的源键),因此nodeID
。