我正在开发一个使用Restkit将“Events”与JSON API同步的事件应用程序。映射看起来大致如此。
var eventsMapping = RKEntityMapping(forEntityForName: "Event", inManagedObjectStore: managedObjectStore)
eventsMapping.identificationAttributes = ["eventID", "name", "eventDescription"]
eventsMapping.addAttributeMappingsFromDictionary([
"id":"eventID",
"title":"name",
"description":"eventDescription",
(more mapping attributes here, etc...)
])
使用NSFetchedResultsController显示事件。在本地,有一个'User'NSManagedObject被创建...但是这个对象只是应用程序的本地对象,并且不会通过Restkit同步到服务器。 “用户”与事件具有一对多的关系,目的是用户可以“保存”他们正在参加的事件。 (注意:现在,核心数据关系删除规则的两边都设置为“无操作”。)保存大致以这种方式完成。
var managedObjectContext = RKManagedObjectStore.defaultStore().mainQueueManagedObjectContext
currentUser.mutableSetValueForKey("events").addObject(event)
managedObjectContext?.saveToPersistentStore(&error)
到目前为止,一切都运行良好,所选事件已成功存储并与用户一起保存,并按预期继续通过应用重新启动。但是,有一种情况会导致从用户中删除事件,即在服务器上对该特定事件进行更新时。当Restkit检测到并更新事件时,根据我放在NSFetchedResultsController didChangeObject中的断点,显然Restkit和/或Core Data实际上正在删除该事件,然后将其与更新一起插回。这是透明的,在大多数情况下都很好,但在这种情况下,我认为初始删除是用户中断事件的原因。
当然,上面的eventsMapping并没有以任何方式引用任何与用户的关系,因此这可能是关系中断的另一个原因。我一直在阅读有关Restkit关系的更多信息,并且在成功关联对象之前,我已经在Restkit中使用了关系/属性映射,但在这种情况下,API上存在两个对象。在这种情况下,这里的用户根本不是API的一部分,只有我解释的本地。那么我还应该使用Restkit关系映射吗?或许我应该尝试通过另一种方式完成上述所有工作?
答案 0 :(得分:0)
我想出了答案,我在上面的代码中做了个蠢事。在映射的标识属性上,我有三个不同的属性,当我只应该使用一个永远不会改变的主键(eventID)。
eventsMapping.identificationAttributes = ["eventID"]
显然发生了什么是因为我将标题/名称指定为标识属性,每当在服务器上更改标题时,Restkit会将其标识为新的/不同的对象并删除“旧”对象并插入“新”一。当我更改它只是为了指定主键时,它会触发更新,而我与用户的关系仍然存在。
对于其他人的一个注意事项,我最初还是把它告诉了我:我遇到的一些旧信息帮我解决了这个问题,据说在映射上使用了primaryKeyAttribute。这显然是过时的信息:改为使用identificationAttributes。