我将数据从多个远程文件之一读取到 coredata 中。如果远程文件发生更改,则需要更新核心数据中的数据。例如,假设一个文件包含部门,另一个文件包含员工。 由于公司重组,其中一个部门被更名,而文件中没有员工的第二个部门被删除。员工文件没有更改,所以我只想重新读取部门文件。在我的代码中,我读取该文件,从 coredata 获取部门并更新其 name 属性。但由于第二部门不再存在于文件中,我想将其从核心数据中删除。 我的伪代码解决方案如下:
- 部门实体获取 hasChanged 属性
- 在读取文件之前,所有 hasChanged 属性均设置为 false
- 如果文件中存在部门,则其 hasChanged 属性设置为 true
- 读取文件后,将获取并删除所有 hasChanged 属性设置为 false 的部门
不知何故,这似乎不是很有效。删除所有部门并建立一个新部门似乎也不是很有效,因为核心数据将删除该部门的所有员工,现在我还必须重新读取员工(可能还有所有其他文件)。
有没有更好的方法来解决数据变得多余的问题?如果您用代码回答,则最好使用 swift。
最佳答案
首先,删除规则不应该级联 - 将其更改为无效。 当您从服务器获取新数据时,请按照以下步骤操作:
- 获取所有受影响的实体。如果您要更新部门 - 则获取所有部门
- 将结果存储在以 ID 为键的字典中。
- 还将所有结果存储在名为
objectsToDelete
的可变集中 - 现在迭代您从服务器获取的所有数据。使用您在步骤 #2 中创建的字典查找部门。如果找到该对象,请更新它并将其从您在步骤 #3 中创建的集合中删除。如果找不到该对象,则创建它。
- 如果
objectsToDelete
中还有任何对象,则将其删除 - 保存上下文。
对于员工来说也是同样的原则。您可以使用字典匹配已有的内容,并删除未匹配的内容。
关于ios - 从核心数据中删除多余数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42469373/