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

Posted

技术标签:

【中文标题】Restkit + Coredata - 仅将唯一对象添加到一对多关系中【英文标题】:Restkit + Coredata - Add only unique objects into One-to-Many relationship 【发布时间】:2013-09-18 21:07:53 【问题描述】:

我有一个类似这样的节点详细信息网络服务:

<nid>23</nid>
<timestamp>1345634</timestamp>
<name>Some Name</name>
<synonym_nids>
 <item>
  45
 </item>
 <item>
  85
 </item>
</synonym_nids>

我用我的NSManagedObject 子类创建了RKManagedObjectMapping,它应该保持上述结构。上面提到的nid(&lt;nid&gt;&lt;synonym_nids&gt;)是独一无二的。同义词集合本身应该有唯一的 nid。

我可以在使用 API -setPrimaryKeyAttribute 映射到带有 NSManagedObject 子类的主级别 xml 映射期间将 &lt;nid&gt; 标记为唯一。我确实检查了本地对象中时间戳的值,并将其与列表 API 返回的&lt;timestamp&gt; 进行比较,并且仅当时间戳已过时时才将该对象标记为“脏”。接下来,我只获取那些设置了“脏位”的节点的详细信息——上面显示的 XML 是从详细 API 中提取的。现在,当设置了脏位并且完成了详细 API 的获取时,我最终将多个同义词 id 添加到关系集中,因为 Restkit 中没有机制(根据我目前的研究)来检查 nid 是否为 45和 85(在这种情况下)已经存在于关系集中。因此,每次对象被标记为“脏”时,Restkit 自然会为 nid 45 和 85 添加多个条目。此外,由于没有使用 coredata 在NSSet(一对多)关系中直接输入NSNumber 的固有机制,因此我在NSNumber 周围创建了一个包装器对象,这是一个NSManagedObject 子类以将其添加到关系中设置。

模型对象如下所示:

@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

我如何有效地处理这种情况? Restkit 是否有任何内在的能力来处理这种情况?

更新:

NGInteger64 对象的结构:

@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

请注意NGModelBaseNSManagedObject 的子类,因此NGArticleNGInteger64 也是NSManagedObject 的子类。

【问题讨论】:

【参考方案1】:

Restkit 每次都会为 nid 45 和 85 添加多个条目

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

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

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

【讨论】:

是的,我通过使用 -setPrimaryKeyAttribute 将它们标记为主键来避免节点级别的重复,但我不知道如何避免使用此方法将重复条目添加到集合“lookAlike”中,任何你给我的线索? 什么是NGInteger64,它也需要一个定义的唯一标识符。 NGInteger64 只是 NSNumber 的包装对象,因为我们不能将 NSNumber 指定为 xcdatamodel 文件中关系的目标。它只有一个 NSNumber 成员变量。但是,在这种情况下将具有引用 nid 45 和 85 的 NGInteger64 对象不应在“lookAlike”集中多次添加。 更新了问题以添加更多详细信息。 您是否在映射中将number 设置为NGInteger64 的唯一标识符?

以上是关于Restkit + Coredata - 仅将唯一对象添加到一对多关系中的主要内容,如果未能解决你的问题,请参考以下文章

当我拥有的唯一关系信息是 JSON 结构时,如何在 RestKit 中设置关系?

RestKit 与直接 CoreData

RestKit 和 Coredata

RestKit + CoreData,理解 RKManagedObjectRequestOperation

无法使用 CoreData 配置 RestKit

RestKit + CoreData:从CoreData缓存中排除某些对象