Restkit + Coredata - 仅将唯一对象添加到一对多关系中

时间:2013-09-18 21:07:53

标签: iphone cocoa-touch core-data restkit restkit-0.20

我有一个节点详细信息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的子类,因此NSManagedObjectNGArticle也是NGInteger64的子类。

1 个答案:

答案 0 :(得分:1)

  

Restkit最终每次为nid 45和85添加多个条目

这意味着您没有教过RestKit如何查找指定标识符的实体的现有实例。在这种情况下,RestKit正在创建新对象并将它们添加到关系中。

  

我可以在映射期间将其标记为唯一

是的,您必须这样做才能避免重复。指定给setPrimaryKeyAttribute的名称应该是实体的属性(而不是XML中的源键),因此nodeID