核心数据:从 Rest API 同步数据

Posted

技术标签:

【中文标题】核心数据:从 Rest API 同步数据【英文标题】:Core Data: Sync data from Rest API 【发布时间】:2018-12-24 13:58:51 【问题描述】:

我正在从 Rest API 请求数据,然后将它们与核心数据一起保存到数据库中。

第一个 API 结果

    一个 B C

第二个 API 结果

    一个 C

我们应该删除“B”,因为它从 API 结果中消失了。目前我们在添加新数据之前删除表中的所有数据,但这看起来不对。

我的问题是如何检测已删除的数据并在数据库中以最少的 CPU 开销将其删除?

我可以选择核心数据存储类型(memorysqlite)并且不能使用 NSBashRequest

【问题讨论】:

在刷新之前,您可以将所有当前标识符加载到一个集合中,然后删除您从服务器获取的标识符,最后删除该集合中剩余的对象。或者,您可以添加时间戳,当您获取更新时,在删除具有较早时间戳的任何对象之前,在获取的对象上设置时间戳。 【参考方案1】:

当我不得不这样做时,我通过获取不在新传入数据集中的所有内容并删除获取结果中的所有内容来做到这一点。这仅在您拥有某种唯一 ID 时才有效 - 如果您的 ABC 是没有重复的唯一 ID。

代码类似于

    首先获取在新传入数据中找到的所有唯一 ID。如果传入的对象位于名为restResults 的数组中,则类似于

    NSArray *incomingUniqueIDs = [restResults valueForKey:@"uniqueID"];
    

    使用谓词执行获取请求,该谓词会查找具有唯一 ID 且不在在新列表中的所有内容。类似的东西

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uniqueID not in %@", incomingUniqueIDs];
    

然后执行 fetch 并删除它找到的所有内容。在您的情况下,第二次,incomingUniqueIDs 将包含AC。谓词只会获取B。您将删除该条目,然后就完成了。

【讨论】:

以上是关于核心数据:从 Rest API 同步数据的主要内容,如果未能解决你的问题,请参考以下文章

Dropbox 核心 API 和同步 API

Swift:在后台同步核心数据对象

从核心数据同步数据

WatchKit 核心数据同步

使用 iCloud 进行核心数据同步

现有在线应用程序中的核心数据同步