我必须在 CoreData 实体中批量创建一些数据(导入过程),我想在最后“提交”或在出现错误时“回滚”(因此无法在中间保存)。
问题是,例如,我需要创建一个实体“Person”,然后在这个过程中我需要重新使用该实体。但它可以在此过程之前已经存在,也可以在导入过程中创建。
因此我尝试使用谓词“(personId == 4711)”获取它。但是虽然我已经设置
[fetchRequest setIncludesPendingChanges:YES];
它没有找到新创建的 Person 对象。
我读了这个this question和 this answer哪个州,那是不可能的?我说得对吗?
如果是这样,我该如何解决/处理这个问题?
最佳答案
据我对 CoreData 的了解,这确实是不可能的(如果我错了请纠正我)。
然而,即使这是可能的,您也永远不想在“每个对象”的基础上查询您的商店。
对大型(超过几十个)导入的性能影响是巨大的。
我对您的建议是在导入阶段创建一个由您的唯一标识符键入的字典(从商店中预取现有实体并为不存在的实体创建新实体)。
注意:您应该注意不要在多线程环境中从不同上下文执行多个插入。在这种情况下,您将需要一名协调员来防止重复。
示例:
存储内容:1 --> P1, 3 --> P3
服务响应:1 --> Data1, 2 --> Data2
算法:
响应完成后,从响应中获取所有唯一 ID --> recievedIds
= @[1,2]
在创建 recievedIds
期间设置创建 personId 的映射/字典 --> 数据:
@{1 : 数据 1, 2 : 数据 2}
通过谓词从商店中获取:
[NSPredicate predicateWithFormat:@"personId IN %@",recievedIds]
从生成的数组创建字典。
在这种情况下:existingItems
= @{1 : P1}
传递recievedIds
中的所有ids:
1) 如果 id 存在于 existingItems
更新现有对象
2) else 创建一个新人并将数据插入到新记录中。
这只会从商店中获取一次。
而且你只保存一次。
==> 只有 2 次去商店,而不是每个对象一次
关于iOS Core Data 获取新插入的、尚未保存的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869965/