【问题标题】:Persisting relationship with local user object during a Restkit update在 Restkit 更新期间保持与本地用户对象的关系
【发布时间】:2015-11-22 00:04:24
【问题描述】:

我正在开发一个使用 Restkit 将“事件”与 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 显示事件。在本地,创建了一个“用户”NSManagedObject……但是这个对象只是应用程序的本地对象,并没有通过 Restkit 同步到服务器。 “用户”与事件具有一对多的关系,目的是用户可以“保存”他们正在参加的事件。 (注:目前Core Data关系删除规则两边都设置为“无动作”)保存大致是这样完成的。

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 关系映射吗?或者也许我应该尝试通过其他方式完成以上所有工作?

【问题讨论】:

    标签: ios core-data restkit


    【解决方案1】:

    我找到了答案,我在上面的代码中犯了一个错误。在映射的标识属性中,我有三个不同的属性,而我只应该使用主键永远不会改变的属性(eventID)。

    eventsMapping.identificationAttributes = ["eventID"]
    

    显然发生的事情是因为我将标题/名称指定为标识属性,只要服务器上的标题更改,Restkit 就会将其识别为新的/不同的对象并删除“旧”对象并插入“新”一。当我只更改它以指定主键时,它触发了更新,并且我与用户的关系仍然存在。

    对于其他人一开始就让我感到震惊的另一个注意事项:我遇到的一些旧信息帮助我解决了这个问题,据说在映射上使用 primaryKeyAttribute。这显然是过时的信息:请改用 IdentificationAttributes。

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 2020-08-18
      • 2017-09-26
      • 2013-12-19
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多