ios - 从核心数据中删除多余数据的有效方法

标签 ios swift core-data

我将数据从多个远程文件之一读取到 coredata 中。如果远程文件发生更改,则需要更新核心数据中的数据。例如,假设一个文件包含部门,另一个文件包含员工。 由于公司重组,其中一个部门被更名,而文件中没有员工的第二个部门被删除。员工文件没有更改,所以我只想重新读取部门文件。在我的代码中,我读取该文件,从 coredata 获取部门并更新其 name 属性。但由于第二部门不再存在于文件中,我想将其从核心数据中删除。 我的伪代码解决方案如下:

  • 部门实体获取 hasChanged 属性
  • 在读取文件之前,所有 hasChanged 属性均设置为 false
  • 如果文件中存在部门,则其 hasChanged 属性设置为 true
  • 读取文件后,将获取并删除所有 hasChanged 属性设置为 false 的部门

不知何故,这似乎不是很有效。删除所有部门并建立一个新部门似乎也不是很有效,因为核心数据将删除该部门的所有员工,现在我还必须重新读取员工(可能还有所有其他文件)。

有没有更好的方法来解决数据变得多余的问题?如果您用代码回答,则最好使用 swift。

最佳答案

首先,删除规则不应该级联 - 将其更改为无效。 当您从服务器获取新数据时,请按照以下步骤操作:

  1. 获取所有受影响的实体。如果您要更新部门 - 则获取所有部门
  2. 将结果存储在以 ID 为键的字典中。
  3. 还将所有结果存储在名为 objectsToDelete 的可变集中
  4. 现在迭代您从服务器获取的所有数据。使用您在步骤 #2 中创建的字典查找部门。如果找到该对象,请更新它并将其从您在步骤 #3 中创建的集合中删除。如果找不到该对象,则创建它。
  5. 如果 objectsToDelete 中还有任何对象,则将其删除
  6. 保存上下文。

对于员工来说也是同样的原则。您可以使用字典匹配已有的内容,并删除未匹配的内容。

关于ios - 从核心数据中删除多余数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42469373/

相关文章:

iphone - IOS如何用非数字调用电话

ios - 强制 iOS 设备应用通过本地 WIFI 网络通话

swift - 作为弹出窗口呈现的 UIViewController 可以是它自己的 popoverPresentationController 委托(delegate)吗?

ios - iPhone 和 Apple Watch 应用程序之间的核心数据共享

ios - 核心数据 : Sync data from Rest API

ios - UITableView中的多线程

ios - 章节标题困惑

ios - tabBar 减小嵌套 ViewController 中 View 的大小

ios - 为什么自动调整表格 View 单元格中的 UIImageView 具有内容模式 AspectFit 的原始高度?

swift - 在核心数据中检索具有已过滤子级的父级